我可以在CMake中包含和链接库的最简单方法是什么?

时间:2019-12-25 19:52:02

标签: c++ cmake codeblocks

无论如何,是否只是为编译器和链接器添加搜索目录并添加类似于您对code :: blocks所做的链接器设置?

code::blocks compiler search directory example

code::blocks linker search directory example

code::blocks linker settings example

如果code :: blocks没有过时并且缺少像样的代码完成和掉毛之类的东西,我什至不使用cmake。但这显然是最好的选择,如果我想使用Visual Studio代码或Sublime Text 3之类的编辑器。

我只是不知道如何简单地做include_directories和link_libraries而不会大惊小怪。

编辑:这是我最近的尝试,并且我已经关闭了它才能正常工作。

cmake_minimum_required(VERSION 3.0)
project(Platformer)

include_directories(
    libraries/raylib/include
)

set(
    RAYLIB
    ${PROJECT_SOURCE_DIR}/libraries/raylib/lib/libraylib.dll.a
)

set(SOURCES
    main.cpp
)

add_executable(Platformer ${SOURCES})
link_libraries(${RAYLIB})

这给了我很多未定义的引用

this is what my project structure looks like

2 个答案:

答案 0 :(得分:3)

命令link_libraries仅影响在命令调用后创建的可执行文件/库。 documentation中明确指出:

  

指定在链接由当前目录(<{>} )创建的目标时使用的库或标志,这些目标在当前目录或以下目录中由以下内容创建:<{1}}或add_executable()

您的可执行文件add_library()是在调用Platformer之前 创建的,因此它实际上并未链接。

您需要将呼叫交换到link_librariesadd_executable

link_libraries

或使用link_libraries(${RAYLIB}) add_executable(Platformer ${SOURCES}) 代替target_link_libraries

link_libraries

(在后一种情况下,顺序不会颠倒:add_executable(Platformer ${SOURCES}) target_link_libraries(Platformer ${RAYLIB}) 要求已创建的目标作为第一个参数)。


请注意,target_link_libraries优于target_link_libraries调用,因为它以更结构化的方式生成项目。

答案 1 :(得分:0)

如果您计划有多个全部使用RAYLIB的可执行文件,则将link_libraries排列在SOURCES之前,即在RAYLIB定义之后,因为它的作用是之后定义的任何可执行文件。否则,为每个需要它的目标使用target_link_libraries。

我真的只是用不同的词来回声@Tsyvarev,但我想不出一种方法来表达自己的想法。