欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

cmake-链接动静态库、动态库丢失问题、设置头文件搜索路径

程序员文章站 2022-03-21 07:54:26
1.创建空文件夹,然后cmake快速入门,创建newhello,再创建可执行文件。生成如下:2.创建src文件夹创建include文件夹3.在include下创建test.h#ifndef TEST_H //如果这个宏不存在就定义这个宏,如果存在了就啥也不做#define TEST_Hvoid test();#endif4.在src下创建test.cpp//#include "../include/test.h" //常规方法#include

1.创建空文件夹,然后cmake快速入门,创建newhello,再创建可执行文件。
生成如下:
cmake-链接动静态库、动态库丢失问题、设置头文件搜索路径
2.创建src文件夹
cmake-链接动静态库、动态库丢失问题、设置头文件搜索路径
创建include文件夹
cmake-链接动静态库、动态库丢失问题、设置头文件搜索路径
3.在include下创建test.h

#ifndef TEST_H  //如果这个宏不存在就定义这个宏,如果存在了就啥也不做
#define TEST_H

void test();


#endif

4.在src下创建test.cpp
cmake-链接动静态库、动态库丢失问题、设置头文件搜索路径

//#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
cmake-链接动静态库、动态库丢失问题、设置头文件搜索路径

#内部静态库
add_library(test test.cpp)

这里test是库名,test.cpp是添加的内部静态库文件。
6.在根目录下的CMakeLists.txt里添加子目录、链接库等配置
cmake-链接动静态库、动态库丢失问题、设置头文件搜索路径

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目录生成:
cmake-链接动静态库、动态库丢失问题、设置头文件搜索路径
7.在main.cpp中调用test()函数

#include <iostream>
#include <test.h>

int main(int, char**) {
    std::cout << "Hello, world!\n";
    test();
    system("pause");
    return 0;
}

点击生成:
cmake-链接动静态库、动态库丢失问题、设置头文件搜索路径会生成静态库libttest.a,可执行程序newhello.exe
cmake-链接动静态库、动态库丢失问题、设置头文件搜索路径
在终端中输入./build/newhello.exe可以看到输出成功!
cmake-链接动静态库、动态库丢失问题、设置头文件搜索路径
8.生成动态库
./src/CMakeLists.txt中静态库的基础上加上SHARED,即add_library(ttest SHARED test.cpp) #动态库加SHARED
cmake-链接动静态库、动态库丢失问题、设置头文件搜索路径此时会生成动态库:
cmake-链接动静态库、动态库丢失问题、设置头文件搜索路径
###错误:如果刚才终端执行newhello.exe没有退出的话会报错
此时在终端中再次执行./build/newhello.exe,发现没有输出:
cmake-链接动静态库、动态库丢失问题、设置头文件搜索路径
./build中双击newhello.exe报错:

cmake-链接动静态库、动态库丢失问题、设置头文件搜索路径因为libttest.dll./build/src目录下
cmake-链接动静态库、动态库丢失问题、设置头文件搜索路径
libttest.dll粘贴到./build目录下即可解决
cmake-链接动静态库、动态库丢失问题、设置头文件搜索路径cmake-链接动静态库、动态库丢失问题、设置头文件搜索路径
cmake-链接动静态库、动态库丢失问题、设置头文件搜索路径
但是这样不能叫解决办法。不能每次都手动解决

可以通过将库文件的输出目录设置到./buildnewhello.exe同目录即可
CMakeCache.txt找到对应目录下的全局变量:
cmake-链接动静态库、动态库丢失问题、设置头文件搜索路径注意是LIBRARY_OUTPUT_PATH
cmake-链接动静态库、动态库丢失问题、设置头文件搜索路径

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目录下生成库文件
cmake-链接动静态库、动态库丢失问题、设置头文件搜索路径

本文地址:https://blog.csdn.net/yanzhiwen2/article/details/107161335