cmake-链接动静态库、动态库丢失问题、设置头文件搜索路径
1.创建空文件夹,然后cmake快速入门,创建newhello,再创建可执行文件。
生成如下:
2.创建src文件夹
创建include文件夹
3.在include下创建test.h
#ifndef TEST_H //如果这个宏不存在就定义这个宏,如果存在了就啥也不做
#define TEST_H
void test();
#endif
4.在src下创建test.cpp
//#include "../include/test.h" //常规方法
#include <test.h> //在cmakelists配置即可这样引用
#include <iostream>
void test()
{
std::cout<<"new hello!"<<std::endl;
}
如果要通过#include <test.h>
的方式来引用头文件,需要在CMakeLists.txt中进行配置,添加头文件的搜索路径include_directories(./include)
cmake_minimum_required(VERSION 3.0.0)
project(newhello VERSION 0.1.0)
include(CTest)
enable_testing()
#设置头文件的搜索路径
include_directories(./include)
add_executable(newhello main.cpp)
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)
5.一般情况下希望在每个目录下都有一个配置文件,因此在src中添加CMakeLists.txt
#内部静态库
add_library(test test.cpp)
这里test是库名,test.cpp
是添加的内部静态库文件。
6.在根目录下的CMakeLists.txt
里添加子目录、链接库等配置
cmake_minimum_required(VERSION 3.0.0)
project(newhello VERSION 0.1.0)
include(CTest)
enable_testing()
#设置头文件的搜索路径
include_directories(./include)
#添加子目录,把src里的CMakeLists.txt文件找到,链接起来
add_subdirectory(./src)
add_executable(newhello main.cpp)
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)
#链接库(项目名称 src里的库名)
target_link_libraries(newhello test)
add_subdirectory(./src)
是添加子目录,把src里的CMakeLists.txt
文件找到,链接起来target_link_libraries(newhello test)
是链接库,newhello
是项目名称,test
是./src/CMakeLists.txt
中的库名
保存后结果发现报错:
[main] 正在配置文件夹: newhello
[proc] 执行命令: G:\cmake\cmake-3.18.0-rc3-win64-x64\bin\cmake.EXE --no-warn-unused-cli -DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=TRUE -DCMAKE_BUILD_TYPE:STRING=Debug -DCMAKE_C_COMPILER:FILEPATH=F:\MinGW\bin\gcc.exe -DCMAKE_CXX_COMPILER:FILEPATH=F:\MinGW\bin\g++.exe -Hc:/Users/30261/Desktop/newhello -Bc:/Users/30261/Desktop/newhello/build -G Ninja
[cmake] Not searching for unused variables given on the command line.
[cmake] CMake Error at src/CMakeLists.txt:2 (add_library):
[cmake] The target name "test" is reserved when CTest testing is enabled.
[cmake]
[cmake]
[cmake] -- Configuring incomplete, errors occurred!
[cmake] See also "C:/Users/30261/Desktop/newhello/build/CMakeFiles/CMakeOutput.log".
这是因为之前在./src/CMakeLists.txt
中添加的静态库add_library(ttest test.cpp)
,定义的库名是 test
,会存在冲突。只需要换个名字即可。
修改如下:./src/CMakeLists.txt
如下:
#内部静态库
add_library(ttest test.cpp)
./CMakeLists.txt
如下:
cmake_minimum_required(VERSION 3.0.0)
project(newhello VERSION 0.1.0)
include(CTest)
enable_testing()
#设置头文件的搜索路径
include_directories(./include)
#添加子目录,把src里的CMakeLists.txt文件找到,链接起来
add_subdirectory(./src)
add_executable(newhello main.cpp)
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)
#链接库(项目名称 src里的库名)
target_link_libraries(newhello ttest)
此时保存后便生成成功:
[main] 正在配置文件夹: newhello
[proc] 执行命令: G:\cmake\cmake-3.18.0-rc3-win64-x64\bin\cmake.EXE --no-warn-unused-cli -DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=TRUE -DCMAKE_BUILD_TYPE:STRING=Debug -DCMAKE_C_COMPILER:FILEPATH=F:\MinGW\bin\gcc.exe -DCMAKE_CXX_COMPILER:FILEPATH=F:\MinGW\bin\g++.exe -Hc:/Users/30261/Desktop/newhello -Bc:/Users/30261/Desktop/newhello/build -G Ninja
[cmake] Not searching for unused variables given on the command line.
[cmake] -- Configuring done
[cmake] -- Generating done
[cmake] -- Build files have been written to: C:/Users/30261/Desktop/newhello/build
我们会看到在build目录下也有src目录生成:
7.在main.cpp
中调用test()
函数
#include <iostream>
#include <test.h>
int main(int, char**) {
std::cout << "Hello, world!\n";
test();
system("pause");
return 0;
}
点击生成:
会生成静态库libttest.a
,可执行程序newhello.exe
在终端中输入./build/newhello.exe
可以看到输出成功!
8.生成动态库
在./src/CMakeLists.txt
中静态库的基础上加上SHARED
,即add_library(ttest SHARED test.cpp) #动态库加SHARED
此时会生成动态库:
###错误:如果刚才终端执行newhello.exe没有退出的话会报错
此时在终端中再次执行./build/newhello.exe
,发现没有输出:
在./build
中双击newhello.exe
报错:
因为libttest.dll
在./build/src
目录下
将libttest.dll
粘贴到./build
目录下即可解决
但是这样不能叫解决办法。不能每次都手动解决
可以通过将库文件的输出目录设置到./build
与newhello.exe
同目录即可
在CMakeCache.txt
找到对应目录下的全局变量:
注意是LIBRARY_OUTPUT_PATH
cmake_minimum_required(VERSION 3.0.0)
project(newhello VERSION 0.1.0)
include(CTest)
enable_testing()
#设置头文件的搜索路径
include_directories(./include)
#设置库文件输出路径 CMAKE_CACHEFILE_DIR=C:\Users\30261\Desktop\newhello\build
set(LIBRARY_OUTPUT_PATH ${CMAKE_CACHEFILE_DIR})
#添加子目录,把src里的CMakeLists.txt文件找到,链接起来
add_subdirectory(./src)
add_executable(newhello main.cpp)
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)
#链接库(项目名称 src里的库名)
target_link_libraries(newhello ttest)
此时保存一下会配置:
[main] 正在配置文件夹: newhello
[proc] 执行命令: G:\cmake\cmake-3.18.0-rc3-win64-x64\bin\cmake.EXE --no-warn-unused-cli -DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=TRUE -DCMAKE_BUILD_TYPE:STRING=Debug -DCMAKE_C_COMPILER:FILEPATH=F:\MinGW\bin\gcc.exe -DCMAKE_CXX_COMPILER:FILEPATH=F:\MinGW\bin\g++.exe -Hc:/Users/30261/Desktop/newhello -Bc:/Users/30261/Desktop/newhello/build -G Ninja
[cmake] Not searching for unused variables given on the command line.
[cmake] -- Configuring done
[cmake] -- Generating done
[cmake] -- Build files have been written to: C:/Users/30261/Desktop/newhello/build
再点击生成:
此时在./build
目录下生成库文件
本文地址:https://blog.csdn.net/yanzhiwen2/article/details/107161335