基于前面的环境及工程构建解决方案:主程序 + 静态库 + 动态库,并在主程序中调用静态库和动态库的函数。(参照文章https://www.cnblogs.com/dongc/p/6599461.html和http://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++目录->包含目录,需要将刚才的路径添加进去。