当前位置: 移动技术网 > 移动技术>移动开发>Android > cmake-链接动静态库、动态库丢失问题、设置头文件搜索路径

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

2020年07月08日  | 移动技术网移动技术  | 我要评论

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

可以通过将库文件的输出目录设置到./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)

此时保存一下会配置:

[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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网