我正在使用CMAKE创建具有以下Visual Studio解决方案布局:
Solution
+ Project1 (C)
+ Project2 (Fortran)
目标是围绕Fortran例程(Project2)创建一个C包装器(Project1),并将其组合到一个共享库中。为此,我需要将Fortran项目中生成的.obj文件与C项目中生成的文件链接起来。这可以使用OBJECT库功能(在CMake 2.8.8中引入)。 Detailed here
Project1
创建共享库,Project2
创建.obj文件。
在Project1的CMakeLists.txt中,我使用:
ADD_LIBRARY(lib1${lib1_src} $<TARGET_OBJECTS:lib2>)
在Project2的CMakeLists.txt中,我使用:
ADD_LIBRARY(lib2 OBJECT ${lib2_src})
在解决方案的CMakeLists.txt中,我使用:
cmake_minimum_required(VERSION 2.8.8)
PROJECT (Test)
ENABLE_LANGUAGE (C)
ENABLE_LANGUAGE (Fortran)
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
INCLUDE_DIRECTORIES(project1)
INCLUDE_DIRECTORIES(project2)
ADD_SUBDIRECTORY(project1)
ADD_SUBDIRECTORY(project2)`
我遇到的问题与CMake制作的C项目有关。具体而言,属性 - &gt;下的运行时库设置配置属性 - &gt; C / C ++ - &gt;无论解决方案配置当前设置为什么(Debug | Release),代码生成都默认为多线程DLL 。
这个问题似乎与使用$<TARGET_OBJECTS:objlib>
表达式有关,因为删除它会导致创建一个C Project,根据解决方案配置正确配置运行时库。
任何人都知道为什么会这样,以及我如何修改CMAKE文件来纠正它?
答案 0 :(得分:0)
我能够通过添加第3个项目来解决问题,该项目将.obj文件聚合到共享库中。
Solution
+ Project1 (C)
+ Project2 (Fortran)
+ Project3 (SharedLib)
在Project1的CMakeLists.txt中,我使用:
ADD_LIBRARY(lib1 OBJECT ${lib1_src})
在Project2的CMakeLists.txt中,我使用:
ADD_LIBRARY(lib2 OBJECT ${lib2_src})
在Project3的CMakeLists.txt中,我使用:
ADD_LIBRARY(libName SHARED $<TARGET_OBJECTS:Project1> $<TARGET_OBJECTS:Project2>)