【发布时间】:2014-02-05 07:13:49
【问题描述】:
我从事一个有趣的项目(游戏引擎)已经有一段时间了,我想如果我使用 cmake,我可以让它更便携,更容易跨平台编译。现在我已经像这样设置它,有一个主可执行文件,然后是可执行文件链接到的一堆共享库。我已经找到了生成库和可执行文件所需的所有材料,并将它们链接到可执行文件,但是将静态库或另一个共享库之类的依赖项链接到我生成的库之一呢?这是一个视觉效果
Sentiment (name of project)
-Root (all the interfaces and components of the engine. main.cpp is here
-Sentiment_OGL4Renderer (the files for the Renderer library)
-Sentiment_SFMLGui (the files for the Gui library)
-Sentiment_TestGame (the code for a game)
现在我想要所有这些,可执行文件和共享库构建并放入顶级目录的 bin 文件夹中。我在网上发现这样的设置建议是在每个文件夹中创建 cmakelists.txt 文件,然后在根目录中为每个项目创建一个文件。到目前为止我所拥有的就是这个。
#Sentiment
cmake_minimum_required(VERSION 2.6)
project(Sentiment)
set(RENDERER Sentiment_OGL4Renderer)
set(GUI Sentiment_SFMLGui)
set(GAME Test_Game)
add_definitions(-DBUILD_DLL)
list( APPEND CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS} -g -ftest-coverage -fprofile-arcs")
set(EXECUTABLE_OUTPUT_PATH "${Sentiment_SOURCE_DIR}/bin")
set(LIBRARY_OUTPUT_PATH "${EXECUTABLE_OUTPUT_PATH}")
link_directories("${LIBRARY_OUTPUT_PATH}")
add_subdirectory("${RENDERER}")
add_subdirectory("${GUI}")
add_subdirectory("${GAME}")
add_subdirectory(Root)
在根目录
project(Sentiment_exe)
link_directories("${Sentiment_SOURCE_DIR}/bin")
AUX_SOURCE_DIRECTORY(. new_source_list)
add_executable("${CMAKE_PROJECT_NAME}" ${new_source_list})
target_link_libraries("${CMAKE_PROJECT_NAME}" "${LIBRARY_OUTPUT_PATH}/${RENDERER}" "${LIBRARY_OUPUT_PATH}/${GUI}" "${LIBRARY_OUTPUT_PATH}/${GAME}" "${ADDITIONAL_DEPENDENCIES}")
在 Sentiment_OGL4Renderer 中
project(Sentiment_OGL4-3Renderer)
include_directories(${Sentiment_SOURCE_DIR})
add_definitions(-DGLEW_STATIC)
add_library(Sentiment_OGL4-3Renderer SHARED Sentiment_OGL4Renderer.cpp GL/glew.cpp)
在 Sentiment_SFMLGui 中
project(Sentiment_SFMLGui)
include_directories(${Sentiment_SOURCE_DIR})
add_library(Sentiment_SFMLGui SHARED Sentiment_SFMLGui.cpp)
在 Sentiment_TestGame 中
project(Sentiment_Game)
include_directories(${Sentiment_SOURCE_DIR})
add_library(Sentiment_Game SHARED Game.cpp)
正如你所知道的,有很多第三方库,我尝试了各种链接方法,比如使用 target_link_libraries,但我终其一生都无法弄清楚如何将外部库链接到我创建的库.首先,渲染器使用 GLEW,但它不需要外部依赖,所以忽略它。然后它需要来自 windows sdk 的 OpenGL32.lib 和 Gdi32.lib(仅适用于 windows)。至于 SFML,我在 bin 文件夹中有需要链接的 DLL,(在 linux 中工作时可以轻松获取 .so,如果我选择这样做,可以与最终产品一起分发)。我需要将这些都链接为我创建的库的依赖项,但似乎没有任何效果。该项目都是c++,我目前正在使用mingw32来编译它。我是 cmake 的新手,所以如果它真的很简单,请保持温和。
【问题讨论】:
-
你能发布你得到的错误吗?
-
@Peter - 这样的模块不只适用于已经使用 cmake 的项目吗?这些只是 Windows SDK 中的一些库,还有一些已经在项目中,我认为他们在分发这些 SDK 时并没有考虑到 cmake 构建:P.
-
@123r789 - cmake 执行得非常好,但 makefile 显然失败了,因为渲染器中没有任何链接。它缺少 windows 中的 wgl 函数定义来创建渲染上下文,因为它们位于 OpenGL32.lib 中。我的问题是如何将它链接到我在这里创建的库中。 target_link_libraries 似乎只在生成可执行文件时链接任何东西,而不是库。