为啥 NMake 生成器将 C 文件的 .obj 文件放在 C++ 以外的目录中

Posted

技术标签:

【中文标题】为啥 NMake 生成器将 C 文件的 .obj 文件放在 C++ 以外的目录中【英文标题】:Why NMake generator puts the .obj file for C files in a directory other than those of C ++为什么 NMake 生成器将 C 文件的 .obj 文件放在 C++ 以外的目录中 【发布时间】:2015-03-02 16:58:21 【问题描述】:

我对“NMake Makefiles”生成器有一个神秘的问题。

当我使用我的 CMakeLists 生成解决方案视觉并在之后构建时,他将我所有的 .obj 放在同一个文件夹“sql_lite.dir/Debug/”中。构建成功。

但是当我使用 Nmake 生成器时,他将我的 .obj 放在 2 个不同的文件夹中:

sql_sqlite.dir/C_/Users/mea/Documents/repos/corealpi/external/sqlite

sql_sqlite.dir/C_/Users/mea/Documents/repos/corealpi/external/sqlite/sqlite3.c.obj

我认为我有 file.cpp 和 file.c 是我的问题的问题,因为我有以下输出:

-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Configuring done
CMake Error: Error required internal CMake variable not set, cmake may be not be built correctly.
Missing variable is:
CMAKE_C_COMPILE_OBJECT

这在 Nmake 的结尾:

[100%] Building C object CMakeFiles/sql_sqlite.dir/C_/Users/mea/Documents/repos/
corealpi/external/sqlite/sqlite3.c.obj
Linking CXX shared library C:\Users\mea\Documents\repos\corealpi\build\cmake_x86
d\bin\sql_sqlite.dll
LINK : fatal error LNK1104: cannot open file 'CMakeFiles/sql_sqlite.dir/C_/Users
/mea/Documents/repos/corealpi/external/sqlite/sqlite3.c.obj'
LINK failed. with 1104

看来,他没有在同一个目录中构建,也没有为C文件构建.obj。

这是我的 CMakeLists.txt(在 Visual Studio 下运行良好):

############################### SQLITE ###############################
project(sql_sqlite CXX)

SET(CMAKE_SHARED_LINKER_FLAGS "$CMAKE_SHARED_LINKER_FLAGS /MANIFEST:NO")
# Path of Release
SET(BIN_RELEASE_PATH "../../build/cmake_x86")
SET( CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE "$BIN_RELEASE_PATH/bin/" )
SET( CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE "$BIN_RELEASE_PATH/bin/" )
SET( CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE "$BIN_RELEASE_PATH/bin/" )
# Path of Debug
SET(BIN_DEBUG_PATH "../../build/cmake_x86d")
SET( CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG "$BIN_DEBUG_PATH/bin/" )
SET( CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG "$BIN_DEBUG_PATH/bin/" )
SET( CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG "$BIN_DEBUG_PATH/bin/" )
# Flags
SET(CMAKE_CXX_FLAGS "$CMAKE_CXX_FLAGS /W4 /Ycstdafx.h /Yustdafx.h /D_USRDLL /DSQL_SQLITE_EXPORTS /D_UNICODE /DUNICODE")
SET(CMAKE_CXX_FLAGS_RELEASE "$CMAKE_CXX_FLAGS_RELEASE /Zi /GL /Oi /Gy /O2 /GR- /Gm- /OPT /Fosql_sqlite.dir/src/sql_sqlite")
SET(CMAKE_CXX_FLAGS_DEBUG "$CMAKE_CXX_FLAGS_DEBUG /WX- /ZI /Oy- /Gm /EHsc /MDd /GS /Gd")

    set_source_files_properties(../datasec/src/sql_sqlite/stdafx.cpp PROPERTIES COMPILE_FLAGS "/Ycstdafx.h")  
    set_source_files_properties(../datasec/src/sql_sqlite/main.cpp PROPERTIES COMPILE_FLAGS "/Yustdafx.h")  
    set_source_files_properties(../external/sqlite/sqlite3.c PROPERTIES COMPILE_FLAGS "/Y-")

# Files of library
add_library(

        sql_sqlite

        SHARED

    ../datasec/src/sql_sqlite/stdafx.h
    ../external/sqlite/sqlite3.h

    ../datasec/src/sql_sqlite/sql_sqlite.cpp
    ../datasec/src/sql_sqlite/stdafx.cpp
    ../datasec/src/sql_sqlite/main.cpp  
    ../external/sqlite/sqlite3.c

)

target_link_libraries(sql_sqlite datasec core)

我需要帮助,因为我在很多网站上进行了搜索,在很多天里尝试了不同的解决方案,但无论如何,它仍然无法链接。

我正在尝试输入类似的内容:/Fosql_sqlite.dir/src/sql_sqlite,但没有任何改变。

我必须为 sqlite3.c 制定特殊规则吗?还是我的 CMakeLists.txt 有问题?

为什么 CMake 告诉我:Missing variable is: CMAKE_C_COMPILE_OBJECT

感谢您的帮助。

【问题讨论】:

【参考方案1】:

您的 PROJECT 行仅通过 CXX 指定 C++。也许删除 CXX 将解决问题,以便设置 C 和 C++ 编译器。文档在这里,http://www.cmake.org/cmake/help/v3.2/command/project.html

【讨论】:

好的。效果很好。突然,过度的问题。我太习惯于使用这种语言,以至于我忘记了这一点。谢谢 对于 .obj 文件夹?有没有办法覆盖它并将一个放在“Debug”文件夹中,另一个放在“Realease”中? 我不知道。询问的最佳地点是 cmake 电子邮件列表。您可以在这里注册:cmake.org/mailing-lists

以上是关于为啥 NMake 生成器将 C 文件的 .obj 文件放在 C++ 以外的目录中的主要内容,如果未能解决你的问题,请参考以下文章

文件名前的@符号

如何在makefile(nmake使用的makefile)中加入依赖文件的搜索路径(依赖文件不在当前目录)

Nmake 从 .cpp 文件中获取所有 .o 文件的列表

您可以使用 NMAKE 为变量分配通配符吗? [复制]

在 Windows 上的 nmake 中搜索一种更好的安排依赖项和目标文件的方法

从源文件生成目标文件的通用“make”规则