0

我正在使用 CMAKE 创建具有以下 Visual Studio 解决方案布局:

Solution  
    + Project1 (C)  
    + Project2 (Fortran)

目标是围绕合并到单个共享库中的 Fortran 例程 (Project2) 创建一个 C 包装器 (Project1)。为此,我需要将 Fortran 项目中生成的 .obj 文件与 C 项目中生成的文件链接起来。这可以使用 OBJECT 库功能(在 CMake 2.8.8 中引入)。详细在这里

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 项目有关。具体来说,无论解决方案配置当前设置为什么(调试 | 发布) ,属性 --> 配置属性 --> C/C++ --> 代码生成下的运行时库设置默认为多线程 DLL 。

配置不当

这个问题似乎与$<TARGET_OBJECTS:objlib>表达式的使用有关,因为删除它会导致创建一个 C 项目,该项目会根据解决方案配置正确配置运行时库。

正确配置

任何人都知道为什么会发生这种情况以及如何修改 CMAKE 文件来纠正它?

4

1 回答 1

0

我能够通过添加将 .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>)
于 2013-08-25T02:12:19.010 回答