解决了这个问题后,我有了一个新问题:
情况:我有一个使用 C++ 编写的库的 C 项目。从 C 中只有对函数的调用,但是这些函数的实现使用类。
细节:
该库编译没有错误,但编译 C 项目返回以下错误:
...
Start.cpp:(.text+0x860): undefined reference to `InitialCondition::Load(std::string, bool)'
Start.cpp:(.text+0x227b): undefined reference to `InitialCondition::SetMachIC(double)'
...
一般的:
<calling library implementation>:(...): undefined reference to <a class>::<a method>
这通常表明缺少该库,但在这种情况下,我可以使用该库的大部分功能——只有在实现中使用了一些类时它才会失败。
这是一个例子:
在 C++ 库中:
开始.h
...
#ifdef __cplusplus
extern "C"
{
#endif
void start();
...
#ifdef __cplusplus
}
#endif
启动.cpp
#include "Start.h"
#include "InitialCondition"
InitialCondition* initCond;
void start()
{
// initCond is set somewhere here
...
initCond->SetMachIC(1.0); // (A) has no reference
initCond->SetAlphaDegIC(2.0); // (B) has a reference
}
初始化条件.h
// includes etc.
class InitialCondition : public ABaseClass
{
public:
void SetMachIC(double mach);
void SetAlphaDegIC(double a)
{
// inline implementation
}
};
从 C 调用:
#include "Start.h"
void example()
{
start();
}
由于该库是使用 构建cmake
的,因此这是相关的部分CMakeLists.txt
:
set(INITIALISATION_SRC InitialCondition.cpp)
set(INITIALISATION_HDR InitialCondition.h)
add_library(Init ${INITIALISATION_HDR} ${INITIALISATION_SRC})
set_target_properties (Init PROPERTIES
VERSION "${LIBRARY_VERSION}")
if(BUILD_SHARED_LIBS)
set_target_properties (Init PROPERTIES
SOVERSION ${LIBRARY_SOVERSION}
FRAMEWORK ON)
endif()
install(TARGETS Init LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
RUNTIME DESTINATION lib
# For Mac
FRAMEWORK DESTINATION "/Library/Frameworks")
install(FILES ${INITIALISATION_HDR} DESTINATION include/Project/initialization)
(有很长的文件列表,.cpp
我.h
已经缩短了一点)
注意:顺便说一句。仍然有一些非行方法调用没有这样的错误。
注意:此文件位于子目录中。它添加使用add_subdirectory(initialization)
注意: nm
编译库列表包含:InitialCondition9SetMachICEd
为什么从 C 调用时没有引用这些方法——即使库已链接并且方法的实现可用?
编辑:
以下是用于 C 的命令:
编译:
gcc -I"<include dir>" -O0 -g -Wall -c -fmessage-length=0 -MMD -MP -MF"src/Test.d" -MT"src/Test.d" -o "src/Test.o" "../src/Test.c"
关联:
gcc -L"<searchpath>" -shared -o "libTest.dll" ./src/Test.o -l<library name> -lstdc++
Test.d
包含所有文件的列表#include