当前位置:   article > 正文

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

cmake 增加动态库的搜索路径

1.创建空文件夹,然后cmake快速入门,创建newhello,再创建可执行文件
生成如下:
在这里插入图片描述
2.创建src文件夹
在这里插入图片描述
创建include文件夹
在这里插入图片描述
3.在include下创建test.h

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

void test();


#endif
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

4.在src下创建test.cpp
在这里插入图片描述

//#include "../include/test.h" //常规方法
#include <test.h> //在cmakelists配置即可这样引用
#include <iostream>
void test()
{
    std::cout<<"new hello!"<<std::endl;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

如果要通过#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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

5.一般情况下希望在每个目录下都有一个配置文件,因此在src中添加CMakeLists.txt
在这里插入图片描述

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

这里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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

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".
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

这是因为之前在./src/CMakeLists.txt中添加的静态库add_library(ttest test.cpp),定义的库名是 test,会存在冲突。只需要换个名字即可。
修改如下:
./src/CMakeLists.txt如下:

#内部静态库
add_library(ttest test.cpp)
  • 1
  • 2

./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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

此时保存后便生成成功:

[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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

我们会看到在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;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

点击生成:
在这里插入图片描述会生成静态库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目录下即可解决
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
但是这样不能叫解决办法。不能每次都手动解决

可以通过将库文件的输出目录设置到./buildnewhello.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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

此时保存一下会配置:

[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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

再点击生成:
此时在./build目录下生成库文件
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/292923
推荐阅读
相关标签
  

闽ICP备14008679号