2016-01-20 45 views
2

当我执行make时,它执行类似gcc blah.o -lXtst -lX11并导致类似undefined reference to XTestFakeButtonEvent的错误。我发现了很多答案,他们都说这是因为链接顺序错误。当使用普通gcc时很容易改变订单,但make怎么办?是否有可能改变cmake中的库链接顺序

+1

当然,在添加目标的依赖关系时更改顺序。你没有共享CMake代码,所以很难更明确。你不会改变make中的链接顺序,但是CMake – usr1234567

回答

4

这里有两个答案,一个是懒惰的,一个是正确的。

懒惰的是,您指定依赖关系到target_link_libraries的顺序是它们在命令行中的显示顺序。

然而,这不是一个非常令人满意的答案,因为以这种方式跟踪依赖关系相当单调乏味,而且很容易出现维护错误。

更好的解决方案是明确建模所有依赖关系。也就是说,将每个依赖关系建模为自己的目标(如果处理预编译的依赖关系,可能使用imported targets),然后使用target_link_librariesadd_dependencies正确建模目标间依赖关系。如果你在整个项目中都这么做,你几乎不需要担心订单,因为CMake只是为你处理它。