C++ “错误”;未定义的引用;对于库的某些非内联方法
解决问题后,我有一个新问题:C++ “错误”;未定义的引用;对于库的某些非内联方法,c++,linker,cmake,mingw,C++,Linker,Cmake,Mingw,解决问题后,我有一个新问题: 情境:我有C项目,它使用C++编写的库。在C中,只有对函数的调用,但是这些函数的实现使用类 详细信息: #include "Start.h" void example() { start(); } 库编译时没有错误,但编译C项目会返回以下错误: ... Start.cpp:(.text+0x860): undefined reference to `InitialCondition::Load(std::string, bool)' Start.cpp:
<强>情境:我有C项目,它使用C++编写的库。在C中,只有对函数的调用,但是这些函数的实现使用类
详细信息:#include "Start.h"
void example()
{
start();
}
库编译时没有错误,但编译C项目会返回以下错误:
...
Start.cpp:(.text+0x860): undefined reference to `InitialCondition::Load(std::string, bool)'
Start.cpp:(.text+0x227b): undefined reference to `InitialCondition::SetMachIC(double)'
...
概述:
Start.cpp
InitCondition.h
从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_子目录(初始化)
注意:nm
已编译库的列表包含:InitialCondition9SetMachined
为什么从C调用时没有这些方法的引用?即使库被链接并且方法的实现可用
编辑:
#include "Start.h"
void example()
{
start();
}
以下是用于C的命令:
汇编:
gcc-I”“-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”“-shared-o“libTest.dll”。/src/Test.o-L-lstdc++
Test.d
包含#include
包含的所有文件的列表,C++会损坏名称,而C则不会。C++函数用类似< < /p>之类的方式修饰
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
为了获得C样式名称的粗细,你应该使用<代码>外“C”{}} /Cuth>但是,老实说,我不确定它是如何与类交互的,或者C++的C++程序包括你的库。C++函数用类似< < /p>之类的方式修饰
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
为了获得C样式名称的粗细,你应该使用<代码>外“C”{}} /Cuth>但是,老实说,我不知道它是如何与类交互的,或者C++的项目包括你的库。经过几次修改后,我现在可以编译这两个。然而,这对我来说真的很奇怪,因为所有文件都存在于CmakeList中。
问题似乎是由损坏的cmake列表引起的。经过几次修改后,我现在可以编译这两个。然而,这对我来说真的很奇怪,因为所有文件都存在于CmakeList中。您使用哪个命令来编译C代码?是否有可能生成一个最小的、可编译的测试用例,其中包含:1。只有最基本的要素才能重现这个问题。是否有足够的代码(和命令)来重现这个问题,而无需猜测或填空?这样我们就可以准确地判断出你在做什么,更好地指向正确的方向。你试过把C++应用程序链接到库吗?我想,当库被编译时,有一些内部未定义的引用。在第一个库显示“代码> t>代码>或<代码> u>代码>或者其他什么功能,是否在代码库>代码> >代码>?如果您不能将库与C++连接起来,那么您的库就有问题了。尝试用最小的C++例子来工作,那么它也应该用C来工作。你用哪个命令来编译C代码?它是否可能产生一个最小的可编译的测试用例:1。只有最基本的要素才能重现这个问题。是否有足够的代码(和命令)来重现这个问题,而无需猜测或填空?这样我们就可以准确地判断出你在做什么,更好地指向正确的方向。你试过把C++应用程序链接到库吗?我想,当库被编译时,有一些内部未定义的引用。在第一个库显示“代码> t>代码>或<代码> u>代码>或者其他什么功能,是否在代码库>代码> >代码>?如果您不能将库与C++连接起来,那么您的库就有问题了。尝试用最小的C++例子来处理它,那么它也应该用C来工作。在代码中使用了这个,但是没有把它插入到我的例子中。所有从C调用的函数都在这样一个extern“C”
块中(在标题中),但是这不起作用。在我的代码中使用了它,但没有将其插入到我的示例中。所有从C调用的函数都在这样一个extern“C”
块中(在标题中),但是这不起作用。
#include "Start.h"
void example()
{
start();
}
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)
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++