CMake 未解决的外部问题
CMake unresolved externals
我正在尝试使用 Visual Studio 2013 编译一个非常简单的 CMake 项目,但是在尝试编译它时出现以下错误:
error LNK1120: 1 unresolved externals cmake_issue\build\Debug\cmake_issue.exe 1 1 cmake_issue
error LNK2001: unresolved external symbol "public: static int Other::value" (?value@Other@@2HA) cmake_issue\build\test.obj cmake_issue
我有一个基本目录 CMakeLists.txt
在:
project(cmake_issue)
add_subdirectory(other)
add_executable(cmake_issue src/test.cc)
target_link_libraries(cmake_issue other)
以及src/test.cc
的内容:
#include <cstdio>
#include "other/other.h"
int main(int argc, char *argv[]) {
printf("value = %d\n", Other::value);
return 0;
}
和一个名为 other
的子目录,其中包含以下 CMakeLists.txt
:
add_library(other SHARED src/other.cc)
target_include_directories(other PUBLIC include)
target_link_libraries(other)
以及other/include/other/other.h
的内容:
#ifndef _OTHER_H_
#define _OTHER_H_
class __declspec(dllexport) Other {
public:
static int value;
};
#endif
以及other/src/other.cc
的内容:
#include "other/other.h"
int Other::value = 30;
如果我使用 cmake 构建项目,然后在 Visual Studio 中打开生成的 sln,这两个项目都会出现在解决方案资源管理器中。
如果我右键单击并构建 other
,它构建良好。但是,如果我尝试构建 cmake_issue
,则会出现上述错误。看起来 cmake_issue
解决方案没有使用编译 other
解决方案时生成的 other.dll
(或 other.lib
)文件。
如果需要,我可以上传源代码的 zip。
好的,问题不在 CMake 方面,而是在 C++ 方面。当您在可执行文件中使用 dllexport'ed class 时,其定义应显示为 class __declspec(dllimport) Other
。此代码工作正常,例如:
#include <cstdio>
class __declspec(dllimport) Other {
public:
static int value;
int a();
};
int main(int argc, char *argv[]) {
printf("value = %d\n", Other::value);
return 0;
}
这是一个 link 完整的解决方案:https://social.msdn.microsoft.com/Forums/en-US/6c43599d-6d9d-4709-abf5-4d1e3f5e4fc9/exporting-static-class-members
我正在尝试使用 Visual Studio 2013 编译一个非常简单的 CMake 项目,但是在尝试编译它时出现以下错误:
error LNK1120: 1 unresolved externals cmake_issue\build\Debug\cmake_issue.exe 1 1 cmake_issue
error LNK2001: unresolved external symbol "public: static int Other::value" (?value@Other@@2HA) cmake_issue\build\test.obj cmake_issue
我有一个基本目录 CMakeLists.txt
在:
project(cmake_issue)
add_subdirectory(other)
add_executable(cmake_issue src/test.cc)
target_link_libraries(cmake_issue other)
以及src/test.cc
的内容:
#include <cstdio>
#include "other/other.h"
int main(int argc, char *argv[]) {
printf("value = %d\n", Other::value);
return 0;
}
和一个名为 other
的子目录,其中包含以下 CMakeLists.txt
:
add_library(other SHARED src/other.cc)
target_include_directories(other PUBLIC include)
target_link_libraries(other)
以及other/include/other/other.h
的内容:
#ifndef _OTHER_H_
#define _OTHER_H_
class __declspec(dllexport) Other {
public:
static int value;
};
#endif
以及other/src/other.cc
的内容:
#include "other/other.h"
int Other::value = 30;
如果我使用 cmake 构建项目,然后在 Visual Studio 中打开生成的 sln,这两个项目都会出现在解决方案资源管理器中。
如果我右键单击并构建 other
,它构建良好。但是,如果我尝试构建 cmake_issue
,则会出现上述错误。看起来 cmake_issue
解决方案没有使用编译 other
解决方案时生成的 other.dll
(或 other.lib
)文件。
如果需要,我可以上传源代码的 zip。
好的,问题不在 CMake 方面,而是在 C++ 方面。当您在可执行文件中使用 dllexport'ed class 时,其定义应显示为 class __declspec(dllimport) Other
。此代码工作正常,例如:
#include <cstdio>
class __declspec(dllimport) Other {
public:
static int value;
int a();
};
int main(int argc, char *argv[]) {
printf("value = %d\n", Other::value);
return 0;
}
这是一个 link 完整的解决方案:https://social.msdn.microsoft.com/Forums/en-US/6c43599d-6d9d-4709-abf5-4d1e3f5e4fc9/exporting-static-class-members