从子目录链接库的CMake

14

我正在尝试在我的项目中使用SFML源代码。我的目录结构如下:

main
  SFML (subtree synced with the official git repo)
  src
    <various modules>
    General (here lies the binary)

我从主目录开始先添加SFML子目录,然后再添加src目录。根据构建日志的观察,这将生成以下库:

sfml‑system
sfml‑window
sfml‑network
sfml‑graphics
sfml‑audio
sfml‑main

现在我想将它们链接到我的二进制文件中,就像这样:

add_executable(main ${main_SRCS})
target_link_libraries (main
  sfml‑system
  sfml‑window
  sfml‑network
  sfml‑graphics
  sfml‑audio
  sfml‑main
  # Other stuff here
)

但是我得到:

/usr/lib/gcc/x86_64-pc-linux-gnu/4.9.2/../../../../x86_64-pc-linux-gnu/bin/ld: cannot find -lsfml‑system
/usr/lib/gcc/x86_64-pc-linux-gnu/4.9.2/../../../../x86_64-pc-linux-gnu/bin/ld: cannot find -lsfml‑window
/usr/lib/gcc/x86_64-pc-linux-gnu/4.9.2/../../../../x86_64-pc-linux-gnu/bin/ld: cannot find -lsfml‑network
/usr/lib/gcc/x86_64-pc-linux-gnu/4.9.2/../../../../x86_64-pc-linux-gnu/bin/ld: cannot find -lsfml‑graphics
/usr/lib/gcc/x86_64-pc-linux-gnu/4.9.2/../../../../x86_64-pc-linux-gnu/bin/ld: cannot find -lsfml‑audio
/usr/lib/gcc/x86_64-pc-linux-gnu/4.9.2/../../../../x86_64-pc-linux-gnu/bin/ld: cannot find -lsfml‑main

CMake为什么要尝试使用系统库而不是刚刚构建的库,我该如何解决这个问题?


顶层 CMakeLists 做了以下几件事情: add_subdirectory(SFML) add_subdirectory(src)我可以在构建日志中看到库的名称: 链接 CXX 共享库 ../../../lib/libsfml-graphics.so 等等。 - Tommalla
@BaummitAugen 我刚意识到SFML子目录定义了自己的项目。我想这回答了你的问题,对我也有所改变吧? - Tommalla
如果在当前的CMake文件中没有sfml-system已知的目标,那么显然你不能说“链接到该目标!”。不过你可以添加额外的链接目录(即要搜索库的目录),请参见例如http://www.cmake.org/pipermail/cmake/2011-May/044295.html。 - Baum mit Augen
@BaummitAugen,我不知道为什么你的链接说不要使用link_directories,但是这个问题的简单答案是“使用link_directories(<库所在位置>)”。OP应该将路径表达为${CMAKE_BUILD_DIR}/buildSubDirectory - Antonio
@Antonio 我也不知道。据我所知,link_directories 是可以的。但是也许应该仔细检查一下,看看是否存在我现在想不到的陷阱。 - Baum mit Augen
显示剩余3条评论
1个回答

14

这应该只是有效的。

我尝试了在CMake 3.2上使用Visual Studio生成器(在Windows上)和Makefile生成器(在Linux上)进行以下操作:

cmake_minimum_required(VERSION 2.8)

project(test)

add_subdirectory(SFML-2.2)

add_executable(foo bar.cpp)
target_link_libraries(foo sfml-system)

SFML已正确构建,foo正确链接到sfml-system

事实上,您从另一个子目录构建可执行文件不应对此产生影响。


1
你的答案是正确的,但出于某种原因在我的项目中无法工作(但在一个虚拟项目中可以)。因此我选择将其作为被接受的答案。 - Tommalla
3
在当前的 CMake 中,add_subdirectory 调用(创建目标 sfml-system)和 target_link_libraries 调用(与该目标链接)之间的顺序不重要:即使重新调整这些调用的顺序,CMake 仍然可以正确确定 sfml-system 是一个目标而不是一个普通文件。但是,add_executable 调用(创建 foo 目标)和 target_link_libraries 调用(将此目标链接到其他目标)之间的顺序很重要。如果顺序颠倒,CMake 将会报错。 - Tsyvarev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接