直接从.cpp文件编译代码有效。首先制作目标文件然后链接,导致功能错误的多重定义?

时间:2015-10-07 16:55:04

标签: c++ object makefile

# Compiler
CXX      := g++
CF       := -g

# c files
CFILES   := $(wildcard src/*.cpp)
SOURCES  := $(CFILES) # $(CFILES2) all CFILES

# o files
OBJECTS  := $(SOURCES:.cpp=.o)
OBJECTS_A:= $(SOURCES:.cpp=_a.o)

# Macros
MACRO = -D
INFO = -DINFO // optional
DCDREAD = -DDCDREAD
# More Macros
DEFAULT   = -DDEFAULT
CONTACT = -DDEFAULT -DCONTACT -DCONTACTPERSIST -DTENSION_COSTHETA
MTCONTACT = -DDEFAULT -DMTCON1 -DMTCON2
DCDCON = -DDCDREAD -DCONTACT -DCONTACTPERSIST -DTENSION_COSTHETA
DCDMT = -DDCDREAD -DMTCON1 -DMTCON2
CENMOV = -DDCDREAD -DMTCON1 -DCENTROIDMOVEMENT
ANGLE = -DDCDREAD -DINERTIA -DANGLE
ANG3 = -DDCDREAD -DMTCON1 -DANGLE3CENTROID

ang3o: $(OBJECTS_A)
    $(CXX) $(OBJECTS_A) -o test/$(EXEC)_dcd_angle3centroid
    cd test && ./$(EXEC)_dcd_angle3centroid mtonly_seamup.ref.pdb      mtonly_seamup_d1_indent.dcd 1 209 1
ang3: $(OBJECTS)
    $(CXX) $(SOURCES) $(CF) $(INC) $(LIB) $(ANG3) -o   test/$(EXEC)_dcd_angle3centroid
    cd test && ./$(EXEC)_dcd_angle3centroid mtonly_seamup.ref.pdb mtonly_seamup_d1_indent.dcd 1 209 1

# To obtain object files
$(OBJECTS_A) : $(SOURCES)
    $(CXX) $(CF) $(INC) $(LIB) $(ANG3) -c $< -o $@
%.o: %.cpp
    $(CXX) $(CC_FLAGS) $(INC) $(LIB) -c $< -o $@

我知道ANG3规则中不需要这些对象。 c文件直接编译,可执行文件正确运行!我想切换到对象,一个ANG3O规则。这是我的主要问题,我是否试图在ANG3O规则的末尾错误地链接.o文件?

ANG3有效。 ANG3O失败了。函数错误的多重定义。

make ang3
g++ -g -O3 -Iinclude -pthread -c src/readfile.cpp -o src/readfile.o 

g++ -g -O3 -Iinclude -pthread -c src/main.cpp -o src/main.o         

g++ -g -O3 -Iinclude -pthread -c src/md.cpp -o src/md.o
g++ -g -O3 -Iinclude -pthread -c src/chain.cpp -o src/chain.o
g++ src/readfile.cpp src/main.cpp src/md.cpp src/chain.cpp  -g -Iinclude -pthread -DDCDREAD -DMTCON1 -DANGLE3CENTROID -o test/run_segment_dcd_angle3centroid


make ang3o
g++ -g -Iinclude -pthread -DDCDREAD -DMTCON1 -DANGLE3CENTROID -c     src/readfile.cpp -o src/readfile_a.o
g++ -g -Iinclude -pthread -DDCDREAD -DMTCON1 -DANGLE3CENTROID -c src/readfile.cpp -o src/main_a.o
g++ -g -Iinclude -pthread -DDCDREAD -DMTCON1 -DANGLE3CENTROID -c src/readfile.cpp -o src/md_a.o
g++ -g -Iinclude -pthread -DDCDREAD -DMTCON1 -DANGLE3CENTROID -c src/readfile.cpp -o src/chain_a.o
g++ src/readfile_a.o src/main_a.o src/md_a.o src/chain_a.o -o test/run_segment_dcd_angle3centroid

src/main_a.o: In function `ReadLines(Chain*)':
/home/d/sop_dev/contacts/segment/src/readfile.cpp:43: multiple     definition of `ReadLines(Chain*)'
                src/readfile_a.o:/home/d/sop_dev/contacts/segment/src/readfile.cpp:43:     first defined here
src/main_a.o: In function `ReadMolecularContent(char*)':
/home/d/sop_dev/contacts/segment/src/readfile.cpp:208: multiple     definition of `ReadMolecularContent(char*)'
        src/readfile_a.o:/home/d/sop_dev/contacts/segment/src/readfile.cpp:208:    first defined here
src/md_a.o: In function `ReadLines(Chain*)':
/home/d/sop_dev/contacts/segment/src/readfile.cpp:43: multiple     definition of `ReadLines(Chain*)'
    src/readfile_a.o:/home/d/sop_dev/contacts/segment/src/readfile.cpp:43:     first defined here
src/md_a.o: In function `ReadMolecularContent(char*)':
/home/d/sop_dev/contacts/segment/src/readfile.cpp:208: multiple     definition of `ReadMolecularContent(char*)'
    src/readfile_a.o:/home/d/sop_dev/contacts/segment/src/readfile.cpp:208:    first defined here
src/chain_a.o: In function `ReadLines(Chain*)':
/home/d/sop_dev/contacts/segment/src/readfile.cpp:43: multiple     definition of `ReadLines(Chain*)'
        src/readfile_a.o:/home/d/sop_dev/contacts/segment/src/readfile.cpp:43:     first defined here
src/chain_a.o: In function `ReadMolecularContent(char*)':
/home/d/sop_dev/contacts/segment/src/readfile.cpp:208: multiple     definition of `ReadMolecularContent(char*)'
    src/readfile_a.o:/home/d/sop_dev/contacts/segment/src/readfile.cpp:208:    first defined here
/usr/lib/gcc/x86_64-unknown-linux-gnu/5.2.0/../../../../lib/crt1.o: In     function `_start':
(.text+0x20): undefined reference to `main'
collect2: error: ld returned 1 exit status
Makefile:172: recipe for target 'ang3o' failed
make: *** [ang3o] Error 1

注意:

相关问题:Error with multiple definitions of function

可能相关:One definition rule and different class definitions in two translation units

然而,在我的情况下: 标头位于include目录中。 c文件位于src目录中。所有函数都在头文件中声明。只包含标题,没有c / cpp文件。 Makefile示例似乎在此复杂程度之前停止,使用不同的定义代码段,以及需要使用/不使用某些已定义的部分来编译对象。

2 个答案:

答案 0 :(得分:2)

实际读取输出有帮助。

g++ -g -Iinclude -pthread -DDCDREAD -DMTCON1 -DANGLE3CENTROID -c src/readfile.cpp -o src/readfile_a.o
g++ -g -Iinclude -pthread -DDCDREAD -DMTCON1 -DANGLE3CENTROID -c src/readfile.cpp -o src/main_a.o
g++ -g -Iinclude -pthread -DDCDREAD -DMTCON1 -DANGLE3CENTROID -c src/readfile.cpp -o src/md_a.o
g++ -g -Iinclude -pthread -DDCDREAD -DMTCON1 -DANGLE3CENTROID -c src/readfile.cpp -o src/chain_a.o

您正在反复编译相同的C ++源文件,然后将其链接到自身。

你的错误在于构建对象的秘诀。我会让你阅读the documentation并找出原因。

答案 1 :(得分:-1)

您可以在文件中使用预处理程序指令,以确保在编译过程中不会将相同的代码包含两次。

   #ifndef _MY_FILE_  
   #define _MY_FILE_ 
   /* Your code

   */
   #endif