CMake 找不到我的库文件

Kar*_*rus 5 cmake

我想使用 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.amaths.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)

但这给出了同样的错误。

Com*_*sMS 5

这里的基本问题是libmaths.a没有放置在默认链接器目录之一中。更大的问题是你一开始就传递libmaths.a给了。target_link_libraries

这很糟糕,有几个原因,但最明显的是它完全不可移植。不同的编译器工具链可能使用与静态库不同的结尾.a,因此您将无法在那里构建。此外,如果您决定将来切换到动态链接,则意味着重构现有的 CMake 脚本。

正确的解决方案是不要将硬编码的文件名传递给target_link_libraries. 您可以采取两条路来避免这种情况。

  1. 使用查找脚本。本质上,你先打电话find_library(MY_MATHLIB maths [...]),然后再做target_link_libraries(alpha ${MY_MATHLIB}).a这将以可移植的方式确定文件的绝对路径并将其传递给链接器。这种方法的最大缺点是文件.a必须已经存在,查找调用才能成功。因此,如果您想在运行 CMake formaths alpha进行构建或将其构建为 的一部分alpha,则这是行不通的。

  2. 由于这两个库都在您的控制之下,因此请考虑使用CMake 的打包机制。这是迄今为止最方便的构建方法,但不幸的是也是最难设置的。如果您愿意花一些时间深入研究 CMake 文档并尝试构建,我鼓励您尝试一下,但如果您只是想要快速运行的东西,您可能需要坚持使用选项 1。