使用VisualStudio2017开发Linux/c++程序(下)

基于前面的环境及工程构建解决方案:主程序 + 静态库 + 动态库,并在主程序中调用静态库和动态库的函数。(参照文章https://www.cnblogs.com/dongc/p/6599461.htmlhttp://www.mamicode.com/info-detail-1983443.html

一、创建解决方案

1、右键解决方案->添加->新建项目
这里写图片描述
2、 右键staticLib->添加->新建项,添加static.cpp和static.h文件

//static.h
#pragma once

#include <stdio.h>

void static_op();

//static.cpp
#include "static.h"

void static_op()
{
    printf("this is static func()\n");
}

3、创建dynamic.cpp和dynamic.h同理

//dynamic.h
#pragma once

#include <stdio.h>

void dynamic_op();

//dynamic.cpp
#include "dynamic.h"

void dynamic_op()
{
    printf("this is dynamic func()\n");
}

4、main.cpp调用静态库和动态库的函数

#include <cstdio>
#include "../dynamicLib/dynamic.h"
#include "../staticLib/static.h"


int main()
{
    printf("hello from main!\n");
    dynamic_op();
    return 0;
}

二、配置解决方案

配置解决方案,目的在于对解决方案输出结果的管理及调用。
1、配置静态库staticLib
(1)输出目录

$(ProjectDir)bin\$(Platform)\$(Configuration)\
更改为:
$(ProjectDir)..\bin\$(Platform)\$(Configuration)\

(2)目标文件扩展名

.out
更改为:
.a //linux环境的静态库以.a为后缀名

(3)远程生成根目录

~/projects
更改为
/home/kyo/$(SolutionName)

(4)配置类型

应用程序(.out)
更改为:
静态库(.a)

2、 配置动态库dynamicLib
(1)输出目录

$(ProjectDir)bin\$(Platform)\$(Configuration)\
更改为:
$(ProjectDir)..\bin\$(Platform)\$(Configuration)\

(2)目标文件扩展名

.out
更改为:
.so //linux环境的动态库以.so为后缀名

(3)远程生成根目录

~/projects
更改为
/home/kyo/$(SolutionName)

(4)配置类型

应用程序(.out)
更改为:
静态库(.so)

3、配置主程序main
3.1 常规
(1)输出目录

$(ProjectDir)bin\$(Platform)\$(Configuration)\
更改为:
$(ProjectDir)..\bin\$(Platform)\$(Configuration)\

(2)目标文件扩展名

删除.out //linux环境的可执行程序可以没有后缀名

(3)远程生成根目录

~/projects
更改为
/home/kyo/$(SolutionName)

3.2 调试
(1)程序

$(RemoteTargetPath)
更改为:
$(RemoteRootDir)/bin/$(Platform)/$(Configuration)/$(TargetName)$(TargetExt)

(2)工作目录

$(RemoteOutDir)
更改为:
$(RemoteRootDir)/bin/$(Platform)/$(Configuration)

(3)其他调试程序命令

添加:
set solib-search-path $(SolutionDir)bin/$(Platform)/$(Configuration)

3.3 c/c++

$(StlIncludeDirectories);%(AdditionalIncludeDirectories)
前面加上"./..;":
./..;$(StlIncludeDirectories);%(AdditionalIncludeDirectories)
这是CentOS系统上的路径,相当于gcc编译时指定的"-I 路径"选项。

3.4 链接器
(1)常规->附加库目录

%(AdditionalLibraryDirectories)
前面加上"$(RemoteRootDir)/bin/$(Platform)/$(Configuration);"$(RemoteRootDir)/bin/$(Platform)/$(Configuration);%(AdditionalLibraryDirectories)

(2)输入->库依赖项

添加
"staticLib;dynamicLib"
相当于gcc编译时用"-l 库名称"的编译选项。

(3)命令行

添加
"-Wl,-rpath=$(RemoteRootDir)/bin/$(Platform)/$(Configuration)"
用于指定程序运行时搜索动态库的路径

三、编译

1、编译静态库staticLib
2、编译动态库dynamicLib
报错如下:

1>/usr/bin/ld : error : relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
1>D:\app_test\dynamicLib\obj\x64\Debug\dynamic.o : error : Bad value
1>collect2 : error : ld returned 1 exit status

显然需要添加编译选项”-fpic”,在c/c++->命令行->其他选项添加:-fpic
这里写图片描述

3、编译主程序main
4、运行
这里写图片描述

四、编写Linux应用程序的项目

例如用VS2017开发Linux多线程应用程序,则需要加上-lpthread编译选项(跟前面加-fpic的地方一致)。编译出错:提示找不到pthread_create和pthread_join,原因是VS2017没有把Linux的头文件包含进来,因此需要手动把Linux的/usr/include/usr/local/include目录拷贝到VS2017的linux头文件路径下,安装路径下的Common7\IDE\VC\Linux\include\usr。另外,在VC++目录->包含目录,需要将刚才的路径添加进去。

猜你喜欢

转载自blog.csdn.net/qq_29344757/article/details/80307721