提前道歉。这是我必须编写自己的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?