CMake动态构建库作为子目录并链接到主可执行文件

lxkprmvk  于 4个月前  发布在  其他
关注(0)|答案(1)|浏览(99)

我不太擅长CMake,所以我试图创建一个我想要实现的极简示例。
我想写一个库,它与我的主项目一起编译,然后动态链接到我的项目可执行文件。
这是我的测试项目文件系统:
x1c 0d1x的数据
CMakeLists.txt:

cmake_minimum_required(VERSION 3.13)
project(TestProject)

add_subdirectory(lib_wrapper)

add_executable(TestExe main.cpp)

target_link_libraries(TestExe libwrapper)
target_include_directories(TestExe PUBLIC ../lib_wrapper)
target_include_directories(TestExe PUBLIC ../src)

字符串
lib_wrapper/CMakeLists.txt:

add_library (wrapper wrapper.cpp)

target_include_directories (wrapper PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})


src/main.cpp:

#include <src/a_header.h>

int main()
{
    int j = 0;
    return 0;
}


src/a_header.h:

#pragma once

#include <lib_wrapper/wrapper.h>
#include <iostream>

inline void some_func()
{
    std::cout << "some_func()" << std::endl;

    // Call a function from lib_wrapper/wrapper.h
}


cmake ..成功地为主项目生成。但是,当我在文件夹Testmake时,我得到:

Test/main.cpp:3:10: fatal error: src/a_header.h: No such file or directory
    3 | #include <src/a_header.h>


有人能帮帮忙吗?欢迎任何改进的建议。

ujv3wf0j

ujv3wf0j1#

在构建TestExe目标时,根文件夹Test不在包含目录列表中。
一种方法是将${CMAKE_SOURCE_DIR}添加到target_include_directories(TestExe PUBLIC ...行的末尾,在)之前,或者您可能希望将其替换为:

target_include_directories(TestExe PRIVATE 
    ${CMAKE_SOURCE_DIR} 
    ../lib_wrapper 
    .
)

字符串
我将PUBLIC更改为PRIVATE,因为通常可执行目标不会被其他目标继承,因此不需要与其他目标共享包含目录。
你的第二个错误是@Tsyvarev在评论中提到的:

target_link_libraries(TestExe libwrapper)


这应该是

target_link_libraries(TestExe wrapper)


因为您库目标名称是wrapper:

add_library (wrapper wrapper.cpp)

相关问题