关于#g++编译.so#的问题,如何解决?

问题:想把cpp文件做成.so,然后为python调用

cpp文件引用了easyx库
main.cpp的开头:

#include<graphics.h>
#include<conio.h>
#include<iostream>
#include<string> 

用命令行 g++ -o interface.so -shared -fPIC main.cpp
报错 错误:#error "_WIN32_WINNT setting conflicts with specified WINVER"


修改dev的makefile文件为

# Project: C++
# Makefile created by Dev-C++ 5.11

CPP      = g++.exe -D__DEBUG__
CC       = gcc.exe -D__DEBUG__
WINDRES  = windres.exe
OBJ      = main.o
LINKOBJ  = main.o
LIBS     = -L"C:/Program Files (x86)/Dev-Cpp/MinGW64/lib" -L"C:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib" -static-libgcc  "../../../../../Program Files (x86)/Dev-Cpp/MinGW64/lib/libeasyx.a" -g3
INCS     = -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include"
CXXINCS  = -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include/c++"
BIN      = C++.exe
CXXFLAGS = $(CXXINCS) -g3
CFLAGS   = $(INCS) -g3
RM       = rm.exe -f
TAR   = libinterface.so 
LINK = "C:/Program Files (x86)/Dev-Cpp/MinGW64/lib/libeasyx.a"
GRA = "C:/Program Files (x86)/Dev-Cpp/MinGW64/include/graphics.h"
EAS = "C:/Program Files (x86)/Dev-Cpp/MinGW64/include/easyx.h" 

.PHONY: all all-before all-after clean clean-custom

all: all-before $(BIN) $(TAR) all-after

clean: clean-custom
    ${RM} $(OBJ) $(BIN) $(TAR)

$(BIN): $(OBJ)
    $(CPP) $(LINKOBJ) -o $(BIN) $(LIBS)

main.o: main.cpp
    $(CPP) -c main.cpp -o main.o $(CXXFLAGS)

$(TAR):main.cpp
    $(CPP)  -c main.cpp -shared -fPIC -o $(TAR) $(LINK) $(GRA) $(EAS) 

报错[Warning] C:/Program Files (x86)/Dev-Cpp/MinGW64/lib/libeasyx.a:
linker input file unused because linking not done


附:https://zhuanlan.zhihu.com/p/71243212
跟着这个教程走的,但出现了以上问题。

【以下回答由 GPT 生成】

根据问题描述和提供的信息,似乎您在Linux上使用g++编译C++文件为.so文件时遇到了错误,并已经尝试在Dev-C++的makefile文件中进行了修改。以下是我对您的问题的进一步解答和优化建议:

首先,让我们回到使用命令行执行g++ -o interface.so -shared -fPIC main.cpp时报错的问题。根据错误信息#error "WIN32_WINNT setting conflicts with specified WINVER",我们可以知道这个错误是由于指定的WIN32_WINNT设置与指定的WINVER设置冲突所导致的。根据您提供的信息,可以猜测您使用的是Windows特定的头文件和库,而在Linux上编译时会遇到一些问题。

解决这个问题的一种方法是使用条件编译来根据操作系统的不同选择性地包含不同的头文件和库。您可以在您的代码中添加以下代码段来处理这个问题:

#ifdef _WIN32
#include <graphics.h>
#else
#include <linux/graphics.h>  //或者是您所使用的Linux平台上的对应的图形库的头文件
#endif
#include <iostream>
#include <string>
#include <conio.h>

在这个代码段中,我们使用#ifdef预处理指令来检测操作系统是否是Windows。如果是Windows,就包含graphics.h头文件,否则包含Linux平台上对应的图形库头文件。这样就可以避免在Linux上编译时出现WIN32_WINNT设置与WINVER设置冲突的问题。

接下来,关于您对Dev-C++的makefile文件的修改。根据您提供的makefile文件内容,我注意到您的代码中包含了一些Windows特定的路径和库文件。这可能也是导致编译错误的一个原因。

为了在Linux上成功编译您的C++代码为.so文件,您需要对makefile文件进行一些调整和优化。这里给出一个基本的makefile文件示例:

CC = g++
CFLAGS = -Wall -Werror -fpic
LDFLAGS = -shared
LIBS = -lgraphics

SRCS = main.cpp
OBJS = $(SRCS:.cpp=.o)
TARGET = interface.so

all: $(TARGET)

$(TARGET): $(OBJS)
    $(CC) $(LDFLAGS) -o $@ $< $(LIBS)

%.o: %.cpp
    $(CC) $(CFLAGS) -c -o $@ $<

clean:
    rm -f $(OBJS) $(TARGET)

这个makefile文件包含了以下几个重要部分: 1. CC变量指定编译器命令。 2. CFLAGS变量指定编译器选项,例如-Wall用于显示所有警告,-Werror用于将警告视为错误。 3. LDFLAGS变量指定链接器选项,例如-shared用于生成共享库文件。 4. LIBS变量指定需要链接的库文件,例如-lgraphics表示链接名为libgraphics.so的库文件。 5. SRCS变量指定所有源代码文件的列表。 6. OBJS变量通过将.cpp替换为.o来生成所有目标文件的列表。 7. TARGET变量指定最终生成的目标文件名。 8. all规则用来生成目标文件。 9. 模式规则%.o: %.cpp用来生成目标文件的规则。 10. clean规则用来清除生成的目标文件和中间文件。

您可以根据您的需要进行调整、添加或删除编译器选项、链接器选项、库文件等。

将这个makefile文件保存在与您的代码文件相同的目录下,然后通过命令行执行make命令即可进行编译,执行make clean可以清除生成的目标文件和中间文件。

希望以上解答和优化建议对您有帮助。如果您还有任何疑问,请随时提出。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^