当我执行make
时,会执行gcc blah.o -lXtst -lX11
之类的操作,导致undefined reference to XTestFakeButtonEvent
之类的错误。我发现了很多答案,所有人都说这是因为错误的链接顺序。使用普通gcc
时,更改订单很容易,但make
怎么办?
答案 0 :(得分:5)
这里有两个答案,一个是懒人,另一个是右边。
懒惰的是,您指定target_link_libraries
的依赖关系的顺序是它们在命令行中出现的顺序。
然而,这并不是一个非常令人满意的答案,因为以这种方式跟踪依赖关系是相当繁琐的,并且非常容易出现维护错误。
更好的解决方案是明确地为所有依赖项建模。也就是说,将每个依赖项建模为自己的目标(如果处理预编译的依赖项,可能使用imported targets),然后使用target_link_libraries
或add_dependencies
正确建模目标间依赖项。如果你在整个项目中这样做,你(几乎)永远不必担心订单,因为CMake只是为你照顾它。
答案 1 :(得分:0)
解决方案是将 XTestFakeButtonEvent 作为 target_link_libraries 添加到发生未定义引用的库(模块) CMakeLists.txt 中。然后 cmake 将最终了解依赖项要求。