错误“未定义引用”到库的某些非内联方法

时间:2013-03-12 11:28:09

标签: c++ linker cmake mingw

在解决that问题之后,我有一个新问题:

情况:我的C Project使用了用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 ++库中:

Start.h

...

#ifdef __cplusplus
extern "C"
{
#endif

    void start();
    ...
#ifdef __cplusplus
}
#endif

Start.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
}

InitCondition.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

中包含的所有文件的列表

2 个答案:

答案 0 :(得分:1)

C ++在C不会破坏名称。 C ++函数用

之类的东西装饰

__someletters_function_name_

要获得C样式名称修改,您应该使用extern "C" { ... }但是说实话,我不确定它是如何与类或C ++项目(包括您的库)进行交互的。

答案 1 :(得分:0)

似乎问题是由于 cmake 列表损坏引起的。经过几次更改,我现在可以编译了。然而,这对我来说真的很奇怪,因为所有文件都存在于cmakelists中。