c ++中的静态lib无法正常工作

时间:2014-03-25 18:47:00

标签: c++ makefile

我有文件夹ClientServer。 在此文件夹中,我还有另外两个文件夹DatabaseServer。 在Server文件夹中,我有使用“database.h”和“newsgroup.h”的类。 这些文件位于Database文件夹中。我用这个make文件创建了一个lib。我将libfile移动到ClientServer文件夹。然后我尝试在Server文件夹中调用Make;我收到错误。

Makefile:47: ans.d: No such file or directory
Makefile:47: com.d: No such file or directory
Makefile:47: myserver.d: No such file or directory
In file included from myserver.cc:11:0:
ans.h:4:23: fatal error: newsGroup.h: No such file or directory

#include "newsGroup.h"
                   ^
compilation terminated.


#
# Makefile to make the file libclientserver.a, containing
# connection.o and server.o
#
# Define the compiler. g++ can be
# changed to clang++.
CXX = g++
CC  = g++

# Define preprocessor, compiler, and linker flags. Uncomment the # lines
# if you use clang++ and wish to use libc++ instead of libstdc++.
CXXFLAGS =  -g -O2 -Wall -W -pedantic-errors
CXXFLAGS += -Wmissing-braces -Wparentheses -Wold-style-cast 
CXXFLAGS += -std=c++11 
#CPPFLAGS =  -stdlib=libc++
#CXXFLAGS += -stdlib=libc++
#LDFLAGS += -stdlib=libc++

all: libdatabase.a

# Create the library; ranlib is for Darwin and maybe other systems.
# Doesn't seem to do any damage on other systems.

libdatabase.a: Database.o newsGroup.o
    ar rv libdatabase.a Database.o newsGroup.o 
    ranlib libdatabase.a

# Phony targets
.PHONY: all clean

# Standard clean
clean:
    rm -f *.o libclientserver.a

# Generate dependencies in *.d files
%.d: %.cc
    @set -e; rm -f $@; \
         $(CPP) -MM $(CPPFLAGS) $< > $@.$$$$; \
         sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
         rm -f $@.$$$$

# Include the *.d files
SRC = $(wildcard *.cc)
include $(SRC:.cc=.d)

2 个答案:

答案 0 :(得分:0)

实际上,图书馆只是拥有&#34;功能的主体&#34;。

您仍然必须声明函数的原型(包括.h文件),并使其可供编译器访问。

因此,在您的情况下,让编译器可以访问newsgroup.h(在这种情况下,将其放在与ans.h文件相同的文件夹中),它应该可以解决问题。

答案 1 :(得分:0)

newsGroup.h放在目录结构中的哪个位置? .cpp文件是否在同一目录中看到它?否则使用-I选项,告诉编译器可以找到该文件的目录。

添加例如-I <path_to>/Database CXXFLAGS <path_to>,其中CXXFLAGS += -I<path_to>/Database 可能是用于运行编译器的工作目录的完整路径或相对路径:

#include

另一种选择是在ans.h语句中指定相对路径,例如在#include "Database/newsGroup.h"

-I

<path_to>/选项只指向.d 由于.h文件在生成时将接收这些路径并指定此时的依赖关系,因此还应该看到相对于make工作目录的{{1}}依赖项。