【问题标题】:Use shared library linked with a makefile使用与生成文件链接的共享库
【发布时间】:2014-05-22 08:47:04
【问题描述】:

我正在尝试使用以下 make 文件编译我的程序。我在互联网上找到了一个模板,我正在尝试使用它。我只修改了# Main entry point之前的东西


制作文件

# Define executable name
BIN = CLI_DeskManager

# Define source files
SRCS = main.cpp shell.cpp

# Define header file paths
INCPATH = -I./ -I/usr/include/X11/exensions -I/usr/include/X11 -I/home/julien/Documents/DeskManagerDll

# Define the -L library path(s)
LDFLAGS = -L/usr/X11R6/lib -L/home/julien/Documents/DeskManagerDll

# Define the -l library name(s)
LIBS = -lX11 -lXext -Wl,--no-as-needed -lDeskManager -lpthread


# Only in special cases should anything be edited below this line
OBJS      = $(CPP_SRCS:.cpp=.o)
CXXFLAGS  = -Wall -ansi -pedantic -std=c++11 -pthread
DEP_FILE  = .depend


# Main entry point
#
all: depend $(BIN)


# For linking object file(s) to produce the executable
#
$(BIN): $(OBJS)
    @echo Linking $@
    @$(CXX) $^ $(LDFLAGS) $(LIBS) -o $@


# For compiling source file(s)
#
.cpp.o:
    @echo Compiling $<
    @$(CXX) -c $(CXXFLAGS) $(INCPATH) $<


# For cleaning up the project
#
clean:
    $(RM) $(OBJS)

distclean: clean
    $(RM) $(BIN)
    $(RM) $(DEP_FILE)


# For determining source file dependencies
#
depend: $(DEP_FILE)
    @touch $(DEP_FILE)

$(DEP_FILE):
    @echo Generating dependencies in $@
    @-$(CXX) -E -MM $(CXXFLAGS) $(INCPATH) $(SRCS) >> $(DEP_FILE)

ifeq (,$(findstring clean,$(MAKECMDGOALS)))
ifeq (,$(findstring distclean,$(MAKECMDGOALS)))
-include $(DEP_FILE)
endif
endif

错误

但是我有很多类似下面的错误

/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 0 has invalid symbol index 11

但是on this threadsoru 说重要的是:

(.text+0x18): undefined reference to `main'
collect2: error: ld returned 1 exit status
make: *** [CLI_DeskManager] Error 1

其他信息

我已经用 Code::blocks 成功编译了,这是构建日志。

g++ -Wall -fexceptions  -std=c++11 -g -pthread    -I/usr/include/X11/extensions -I/usr/include/X11 -I../DeskManagerDll  -c /home/julien/Documents/CommandLineInterface_DeskManager/main.cpp -o obj/Debug/main.o
g++ -Wall -fexceptions  -std=c++11 -g -pthread    -I/usr/include/X11/extensions -I/usr/include/X11 -I../DeskManagerDll  -c /home/julien/Documents/CommandLineInterface_DeskManager/shell.cpp -o obj/Debug/shell.o
g++ -L-L/usr/lib/i386-linux-gnu  -o bin/Debug/CommandLineInterface_DeskManager obj/Debug/main.o obj/Debug/shell.o   -L/usr/X11R6/lib  -lX11 -lXext -Wl,--no-as-needed -lpthread  /home/julien/Documents/DeskManagerDll/bin/Debug/libDeskManagerDll.so 

我在 StackOverflow 上找到了答案,但我不明白。

Linklinklinklink


我做错了什么?

谢谢。


更新 Lijat 回答后

推荐修改后的Makefile

# Define executable name
BIN = CLI_DeskManager

# Define source files
SRCS = main.cpp shell.cpp

# Define header file paths
INCPATH = -I./ -I/usr/include/X11/exensions -I/usr/include/X11 -I/home/julien/Documents/DeskManagerDll

# Define the -L library path(s)
LDFLAGS = -L/usr/X11R6/lib -L/home/julien/Documents/DeskManagerDll/bin/Debug


# Define the -l library name(s)
LIBS = -lX11 -lXext -Wl,--no-as-needed -lDeskManagerDll -lpthread


# Only in special cases should anything be edited below this line
OBJS      = $(CPP_SRCS:.cpp=.o)
CXXFLAGS  = -Wall -ansi -pedantic -std=c++11 -pthread
DEP_FILE  = .depend


# Main entry point
#
all: depend $(BIN)


# For linking object file(s) to produce the executable
#
$(BIN): $(OBJS)
    echo Linking $@
    $(CXX) $^ $(LDFLAGS) $(LIBS) -o $@


# For compiling source file(s)
#
.cpp.o:
    echo Compiling $<
    $(CXX) -c $(CXXFLAGS) $(INCPATH) $< -o $@


# For cleaning up the project
#
clean:
    $(RM) $(OBJS)

distclean: clean
    $(RM) $(BIN)
    $(RM) $(DEP_FILE)


# For determining source file dependencies
#
depend: $(DEP_FILE)
    touch $(DEP_FILE)

$(DEP_FILE):
    echo Generating dependencies in $@
    -$(CXX) -E -MM $(CXXFLAGS) $(INCPATH) $(SRCS) >> $(DEP_FILE)

ifeq (,$(findstring clean,$(MAKECMDGOALS)))
ifeq (,$(findstring distclean,$(MAKECMDGOALS)))
-include $(DEP_FILE)
endif
endif

完整的输出。我很抱歉它是法语的。我的问题的第一部分只翻译了两个不同的句子。

julien@julien-VirtualBox:~/Documents/CommandLineInterface_DeskManager$ make
touch .depend
echo Linking CLI_DeskManager
Linking CLI_DeskManager
g++  -L/usr/X11R6/lib -L/home/julien/Documents/DeskManagerDll/bin/Debug -lX11 -lXext -Wl,--no-as-needed -lDeskManagerDll -lpthread -o CLI_DeskManager
/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): réadressage 0 a un index de symbole 11 invalide
/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): réadressage 1 a un index de symbole 12 invalide
/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): réadressage 2 a un index de symbole 2 invalide
/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): réadressage 3 a un index de symbole 2 invalide
/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): réadressage 4 a un index de symbole 11 invalide
/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): réadressage 5 a un index de symbole 13 invalide
/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): réadressage 6 a un index de symbole 13 invalide
/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): réadressage 7 a un index de symbole 13 invalide
/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): réadressage 8 a un index de symbole 12 invalide
/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): réadressage 9 a un index de symbole 13 invalide
/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): réadressage 10 a un index de symbole 13 invalide
/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): réadressage 11 a un index de symbole 13 invalide
/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): réadressage 12 a un index de symbole 13 invalide
/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): réadressage 13 a un index de symbole 13 invalide
/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): réadressage 14 a un index de symbole 13 invalide
/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): réadressage 15 a un index de symbole 13 invalide
/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): réadressage 16 a un index de symbole 13 invalide
/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): réadressage 17 a un index de symbole 13 invalide
/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): réadressage 18 a un index de symbole 13 invalide
/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): réadressage 19 a un index de symbole 13 invalide
/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): réadressage 20 a un index de symbole 13 invalide
/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): réadressage 21 a un index de symbole 22 invalide
/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_line): réadressage 0 a un index de symbole 2 invalide
/usr/lib/gcc/i686-linux-gnu/4.8/../../../i386-linux-gnu/crt1.o: dans la fonction « _start »:
(.text+0x18): référence indéfinie vers « main »
collect2: error: ld returned 1 exit status
make: *** [CLI_DeskManager] Erreur 1

【问题讨论】:

    标签: c++ linux dll makefile


    【解决方案1】:

    有点不清楚您要实现什么,您是在尝试创建一个共享库还是只是想使用一个?

    Code::blocks 日志提示第二个选项,如果是这种情况,我注意到您在 Code::blocks 日志中有 libDeskManagerDll.so,在 makefile 中有 -lDeskManager,因为它们是相同的预计会是 -lDeskManagerDll

    这句话对我来说也很奇怪

    @$(CXX) -c $(CXXFLAGS) $(INCPATH) $<
    

    我希望它看起来像

    @$(CXX) -c $(CXXFLAGS) $(INCPATH) $< -o $@
    

    如果这不能解决问题,您能否删除 makefile 中行首的 @ 符号并发布 make 的完整输出?

    更新

    从您的更新中可以清楚地看出,make 不包含链接命令中的目标文件。仔细观察这条线

    SRCS = main.cpp shell.cpp
    

    定义您尝试使用的源文件

    OBJS      = $(CPP_SRCS:.cpp=.o)
    

    将该行更改为

    OBJS      = $(SRCS:.cpp=.o)
    

    应该让你更接近你想要的

    【讨论】:

    • 我正在尝试使用静态库。我试过你说的,我用新的 Makefile 和 make 的完整输出编辑了我的问题。
    猜你喜欢
    • 2016-01-02
    • 2015-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-09
    • 2017-04-24
    • 2010-10-18
    相关资源
    最近更新 更多