未定义的功能参考。链接器无法在我的共享库中找到外部“ C”函数

时间:2019-04-12 10:02:35

标签: c++ makefile linker

提前道歉。这是我必须编写自己的MakeFile的第一个项目,它很杂乱。任何指针将不胜感激。

目标:我想链接到包含外部“ C”功能的共享库。并非库中的所有项目都在外部“ C”中声明,只是一个函数。

我可以成功链接到共享库,并调用非外部的“ C”项目。但是,当我调用这些外部“ C”函数时,ld返回的是未定义的引用。

这是我的makefile文件的相关部分

CC = gcc
CFLAGS = -lstdc++ -std=c++11 -Wall -c
LFLAGS = -lstdc++ -Wall
INCLUDE = -I ../util/boost_1_61_0 -I ../util/UCI_v74.0-OMS_v1.3/include -I ../util/util
OBJS = TimeService.o main.o
LIB = -L /usr/lib64

all : $(OBJS)
    $(CC) -o $@ $(OBJS) $(INCLUDE) $(LIB) $(LFLAGS) -o main -luciapi1.3

TimeService.o : TimeService.cpp TimeService.h
    $(CC) $(INCLUDE) TimeService.cpp $(CFLAGS)

main.o : main.cpp TimeService.h
    $(CC) $(INCLUDE) main.cpp $(CFLAGS)

此编译将为我提供extern“ C” {}

中未包含的所有所需信息

我尝试过这样包含头文件:

extern "C" {
    #include "fileIneed.h" //Did not help
}

这并没有改变。

我只是不明白为什么我可以打出这个库中没有包装在外部“ C”中的所有内容。

感谢您的帮助。

修改

我去阅读了一篇很棒的文章(Combining C++ and C - how does #ifdef __cplusplus work?),其中阐明了extern c在做什么,但是现在我对为什么这行不通更加困惑。

我读到编译时顺序很重要,但是我的-llib位于最后。

如果有帮助,这是comp错误。

$ gcc -I ../util/boost_1_61_0 -I ../util/UCI_v74.0-OMS_v1.3/include -I ../util/util TimeService.cpp -lstdc++ -std=c++11 -Wall -c

$ gcc -I ../util/boost_1_61_0 -I ../util/UCI_v74.0-OMS_v1.3/include -I ../util/util main.cpp -lstdc++ -std=c++11 -Wall -c

$ gcc -o all ../util/util/otherclass1.o otherclass2.o TimeService.o main.o -I ../util/boost_1_61_0 -I ../util/UCI_v74.0-OMS_v1.3/include -I ../util/util -L /usr/lib64 -lstdc++ -Wall -o TimeServiceLauncher  -luciapi1.3
TimeService.o: In function `TimeService::TimeService()':
TimeService.cpp:(.text+0x19a): undefined reference to `fucntionIwantReallyBad'
TimeService.cpp:(.text+0x1f4): undefined reference to `otherFunctionThatIWantInSameSituation'
collect2: error: ld returned 1 exit status
make: *** [all] Error 1

编辑2

我尝试以两种不同的方式包含文件,但均未解决:

#ifdef __cplusplus
extern "C" {
#endif
    #include "uci/base/AbstractServiceBusConnection.h"
#ifdef_cplusplus
}
#endif

#ifdef __cplusplus
extern "C" {
    #include "uci/base/AbstractServiceBusConnection.h"
}
#endif

这是在库中声明函数的方式。

#ifdef __cplusplus
extern "C" {
#endif

    EXPORT location::in::library* function(param1, param2) throw(exception);

#ifdef __cplusplus
}
#endif

我将尝试使用g ++,但不确定是否会有所作为。如果有的话我会更新。

我开始认为我不知道如何调用该函数?
我应该能够在包含.h文件的.cpp类中调用函数。

我不必走了

location::of::file.function //or location::of::file::function, correct?

0 个答案:

没有答案