我想使用 CMake 创建一个简单的静态库Maths,然后链接到该库以创建一个简单的可执行文件Alpha。
这是我的目录结构:
/Maths
/build
/
/CMakeLists.txt
/maths.cpp
/maths.h
/Alpha
/build
/
/CMakeLists.txt
/main.cpp
Run Code Online (Sandbox Code Playgroud)
以下是这些文件的内容:
* CMakeLists.txt(用于数学)*
cmake_minimum_required(VERSION 2.6)
project(Maths)
add_library(maths STATIC maths.cpp)
Run Code Online (Sandbox Code Playgroud)
* 数学.cpp *
int Double(int x)
{
int y = x * 2;
return y;
}
Run Code Online (Sandbox Code Playgroud)
* 数学.h *
int Double(int x);
Run Code Online (Sandbox Code Playgroud)
* CMakeLists.txt(用于 Alpha)*
cmake_minimum_required(VERSION 2.8)
project(Alpha)
add_executable(alpha main.cpp ../Maths/maths.h)
target_link_libraries(maths ../Maths/build/libmaths.a)
Run Code Online (Sandbox Code Playgroud)
* main.cpp *
#include <iostream>
#include "maths.h"
using namespace std;
int main()
{
int x = 5;
int y = Triple(x);
cout << "The answer = " << y << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
所以,我进入目录/Maths/build,然后运行cmake ..。然后,我跑make。这将libmaths.a在目录中创建库文件/Maths/build。
然后,我进入目录/Alpha/build,并运行cmake ... 然后,我跑make。但是,这给了我错误消息:
/usr/bin/ld: cannot find -lmaths
Run Code Online (Sandbox Code Playgroud)
为什么找不到我刚刚创建的库文件?
我还尝试复制libmaths.a并maths.h进入目录/Alpha,并将 Alpha 的 CMakeLists.txt 更改为:
cmake_minimum_required(VERSION 2.8)
project(Alpha)
add_executable(alpha main.cpp maths.h)
target_link_libraries(maths libmaths.a)
Run Code Online (Sandbox Code Playgroud)
但这给出了同样的错误。
这里的基本问题是libmaths.a没有放置在默认链接器目录之一中。更大的问题是你一开始就传递libmaths.a给了。target_link_libraries
这很糟糕,有几个原因,但最明显的是它完全不可移植。不同的编译器工具链可能使用与静态库不同的结尾.a,因此您将无法在那里构建。此外,如果您决定将来切换到动态链接,则意味着重构现有的 CMake 脚本。
正确的解决方案是不要将硬编码的文件名传递给target_link_libraries. 您可以采取两条路来避免这种情况。
使用查找脚本。本质上,你先打电话find_library(MY_MATHLIB maths [...]),然后再做target_link_libraries(alpha ${MY_MATHLIB})。.a这将以可移植的方式确定文件的绝对路径并将其传递给链接器。这种方法的最大缺点是文件.a必须已经存在,查找调用才能成功。因此,如果您想在运行 CMake formaths 后alpha进行构建或将其构建为 的一部分alpha,则这是行不通的。
由于这两个库都在您的控制之下,因此请考虑使用CMake 的打包机制。这是迄今为止最方便的构建方法,但不幸的是也是最难设置的。如果您愿意花一些时间深入研究 CMake 文档并尝试构建,我鼓励您尝试一下,但如果您只是想要快速运行的东西,您可能需要坚持使用选项 1。
| 归档时间: |
|
| 查看次数: |
15060 次 |
| 最近记录: |