我正在尝试将library2链接到library1,两者都位于同一源代码树中:
MyProject
├── CMakeLists.txt
├── Library1
│ └── CMakeLists.txt
│ └── include
│ └── foo.h
│ └── bar.h
│ └── src
│ └── foo.cpp
│ └── bar.cpp
├── Library2
│ └── CMakeLists.txt
│ └── include
│ └── baz.h
│ └── src
│ └── baz.cpp
CMakeLists.txt:
cmake_minimum_required (VERSION 3.17.0)
project(MyProject)
option(BUILD_SHARED_LIBS ON)
add_subdirectory(Library1)
add_subdirectory(Library2)
Library1/CMakeLists.txt:
project(Library1)
add_library(library1
src/foo.cpp
src/bar.cpp
)
target_include_directories(library1 PUBLIC
${CMAKE_SOURCE_DIR}/Library1/include
)
Library2/CMakeLists.txt:
project(Library2)
add_library(library2
src/baz.cpp
)
target_include_directories(library2 PUBLIC
${CMAKE_SOURCE_DIR}/Library1/include
${CMAKE_SOURCE_DIR}/Library2/include
)
target_link_libraries(library2 PUBLIC library1)
但是当library2到达它的链接阶段时,我收到这个错误:
usr/bin/ld: cannot find -llibrary1
链接器似乎没有在源代码树中查找
library1
。我尝试过直接通过 CMAKE_PREFIX_PATH
和通过 link_directories()
添加到目标的路径(也尝试过 target_link_directories()
)。我也无法使用 find_library()
,因为 library1
在通过运行 make
实际构建之前并不存在。
如何链接到将作为同一项目的一部分生成的目标?我觉得这应该可行。
我没有发现上面的 CMake 有什么特别错误的地方。我倾向于相信这可能是一个小错字,所以我已经重命名了库。
为了缩小问题范围,我删除了一些使当前问题变得混乱的 CMake 代码。
请尝试以下操作:
CMakeLists.txt
cmake_minimum_required(VERSION 3.17.0)
project(MY_PROJECT)
add_subdirectory(Library1)
add_subdirectory(Library2)
Library1/CMakeLists.txt
add_library(foobar STATIC)
target_sources(foobar
src/foo.cpp
src/bar.cpp
)
target_include_directories(foobar PUBLIC
include
)
Library2/CMakeLists.txt
:
add_library(baz STATIC)
target_sources(baz PRIVATE
src/baz.cpp
)
target_include_directories(baz PUBLIC
include
)
target_link_libraries(baz PRIVATE foobar)