C++ 使用g++;,链接库

C++ 使用g++;,链接库,c++,windows,makefile,g++,C++,Windows,Makefile,G++,我已经厌倦了MSVC++6,以及大家总是告诉我它是一个蹩脚的编译器之类的东西 所以现在我决定尝试使用vim+g++和makefile。这是我的问题;我有以下生成文件: # This is supposed to be a comment.. CC = g++ # The line above sets the compiler in use.. # The next line sets the compilation flags CFLAGS=-c -Wall all: main.exe m

我已经厌倦了MSVC++6,以及大家总是告诉我它是一个蹩脚的编译器之类的东西

所以现在我决定尝试使用vim+g++和makefile。这是我的问题;我有以下生成文件:

# This is supposed to be a comment..
CC = g++
# The line above sets the compiler in use..
# The next line sets the compilation flags
CFLAGS=-c -Wall

all: main.exe

main.exe: main.o Accel.o
    $(CC) -o main.exe main.o Accel.o 

main.o: main.cpp Accel.h
    $(CC) $(CFLAGS) main.cpp

Accel.o: Accel.cpp Accel.h
    $(CC) $(CFLAGS) Accel.cpp

clean:
    del main.exe *.o
这在尝试
make
时会出现错误,因为我需要链接到名为
Ws2_32.lib
的windows库,该库是
Winsock2.h
所需的,我
将其包含在我的
.h
文件中


那我该怎么做呢?我尝试了
-l
选项,但无法使其工作。它是如何使用一个有空格的路径的?

MSVC++ 6正在进行中,但是你没有提到你是如何使用MSVC++ 9和NFAUT(VisualC++Express 2008)的。

< P>这不是你的问题的答案,但我建议使用。这是一个多平台多构建环境项目文件生成器。CMake文件的语法非常简单(当然比Makefile简单),它将根据请求生成Makefile或visualstudio项目


手工编码的Makefile的问题是,很快,依赖关系树就会变得如此庞大,以至于维护构建所需的所有规则成为一项非常繁琐的操作。因此,有大量的Makefile生成器(autotools、CMake)或Makefile替代品(SCON、waf、bjam等)。

使用
-L
指定一个目录,其中。使用
-l
(小写ell)指定要从
-l
路径链接的库(以及一些默认值)


要使用空格转义路径,请根据shell的要求使用反斜杠、单引号或双引号。看这个,这个。请参阅本文。第一步:找到要查找的库。对我来说,这是在:

C:\Program Files\Microsoft Visual Studio\VC98\Lib
第二步,用-L传递该目录:

LINKFLAGS=-L"C:\Program Files\Microsoft Visual Studio\VC98\Lib"
第三步,用-l(小写l)传递库的名称:

然后使用它:

main.exe: main.o Accel.o
   $(CC) $(LINKFLAGS) -o main.exe main.o Accel.o 

您应该链接到编译器提供的库。对于cygwin,您应该安装win32 api头和库文件,然后链接到libws2_32(编译器选项类似于-lws2_32)


这个语法对我有用

您是否被迫使用5年以上的编译器?顺便说一句,在makefile中显式地编写依赖项相当麻烦。你应该检查g++s-M开关。所以我必须指定这两个选项?你能给我举个例子吗?只指定-L就足够了吗?是的,您需要指定库和GCC可以找到库的路径。这两个参数可以使用不同的值多次给定。最后,所有符号(例如来自公共运行时的符号)都必须在某个库或对象文件中得到满足。它仍然被“未定义的引用”扼杀WSAStartup@8".. 有什么想法吗?它似乎也在尝试在MinGW目录中编译crt2.c和crt1.c。。我得到了类似C:/MinGw/bin../lib/gcc/.blahblah/crt2.o:crt1.C:(.text+0x3):在Windows中对“\u imp\u atexit”的未定义引用参数键和值之间必须有一个空格。所以必须这样
LINKFLAGS=-L“C:\Program Files\Microsoft Visual Studio\VC98\Lib”-L Ws2_32
我正在使用mingw,我该怎么做?这意味着我不能简单地使用MSVC6中的lib?MinGW也有自己的Win32 API头和库(检查MinGW安装文件夹中的“include”和“lib”文件夹,应该有windows.h和libws2_32.a之类的文件),你应该使用它们。我不知道是否有办法在MinGW中使用MSVC LIB。我刚刚检查了MinGW 5.1.3安装程序:有一个复选框允许安装Win32 API文件。我检查了,并且安装了LIB文件,它被称为libws2_32.a。我将LINKFLAGS变量改为C:\MinGW\lib,将-l选项改为-lws2_32,但它仍然抱怨对WSA的引用未定义_Startup@8.. :像-l开关这样的Slook应该遵循.o文件列表,否则它将不会链接(请尝试“$(CC)-o main.exe main.o Accel.o$(LINKFLAGS)”——最后是$(LINKFLAGS)。这比Makefile的语法更简单。。。您还可以轻松地使makefile自动解析依赖项
main.exe: main.o Accel.o
   $(CC) $(LINKFLAGS) -o main.exe main.o Accel.o 
LIBS = -L"..\Microsoft SDKs\Windows\v6.0A\Lib" -lWS2_32

$(CC) ... -o ... ... $(LIBS)