c++ 如何使用非通用库创建通用二进制文件?

puruo6ea  于 2023-04-01  发布在  其他
关注(0)|答案(1)|浏览(108)

我正在尝试构建一个universal/fat可执行二进制文件,并且我正在使用ncurses进行链接。我使用的是自制的ncurses,因为内置的ncurses不支持宽字符。
问题似乎是-L/path/to/arm/libs -L/path/to/intel/libs从不搜索intel库,因为它在/path/to/arm/libs中找到了正确命名的库。然后它抱怨架构错误。它是错误的,但我希望clang继续在其他路径中寻找具有正确名称和架构的库。
这可能吗?我必须使用lipo或其他东西来从单独的arm和intel库构建一个fat库吗?
这是我的最小应用程序,它在终端窗口周围画了一个边框。

#define _XOPEN_SOURCE_EXTENDED
#include <ncursesw/curses.h>
#include <clocale>

int main(int argc, char* argv[]) {
    setlocale(LC_ALL, "");
    initscr();
    raw();
    noecho();
    keypad(stdscr, true);
    refresh();
    wborder_set(stdscr, WACS_D_VLINE, WACS_D_VLINE, WACS_D_HLINE, WACS_D_HLINE,
    WACS_D_ULCORNER, WACS_D_URCORNER, WACS_D_LLCORNER, WACS_D_LRCORNER);
    getch();
    endwin();
    return 0;
}

下面是我的构建步骤,我实际上使用的是一个makefile,但如果我在链接时只指定一个arch和匹配的lib路径,这些行就可以构建非胖应用程序。

clang++ -std=c++17 -Wall -fno-objc-arc -finput-charset=UTF-8 -I/opt/homebrew/opt/ncurses/include -arch arm64 -arch x86_64 -c -o main.o main.cpp
clang++ -L/opt/homebrew/opt/ncurses/lib -L/usr/local/homebrew/opt/ncurses/lib -lncurses -arch arm64 -arch x86_64 -o test main.o
lp0sw83n

lp0sw83n1#

下面是我所做的。我为build/lib/libncurses.a添加了一个新的make目标,并将其依赖项设置为homebrew安装的两个libncurses.a文件。它们是libncursesw.a的符号链接,但这仍然有效。我有点担心这两个libs. /opt/homebrew/opt/ncurses/lib/libncurses.a: current ar archive random library文件都没有指定架构,所以我很担心。对于规则,我使用lipo将两个文件连接到一个多拱库中。
最后,这些是我的makefile的相关部分。

# Add our new libdir to the linker's lib path.
LDFLAGS += -L$(BUILD_DIR)/lib

# We make our own fat libs cause homebrew doesn't want to.
$(BUILD_DIR)/lib/libncurses.a: $(BREW_PREFIX)/opt/ncurses/lib $(BREW86_PREFIX)/opt/ncurses/lib
    lipo -create -output ./build/lib/libncurses.a $(BREW_PREFIX)/opt/ncurses/lib/libncurses.a $(BREW86_PREFIX)/opt/ncurses/lib/libncurses.a

我正在研究一种很好的方法来支持其他ncurses的安装,比如从macports或者只是提取tarball并自己构建它,所以建议很受欢迎。我仍然希望有人能想出一个更好的答案。

相关问题