Не удается найти действующую библиотеку при создании файла .nexe приложения Google Chrome NaCl

Проблема. Не удается собрать .nexe с libtomcrypt (-ltomcrypt) на 64-битной машине.

«пропуск несовместимости» или «не найдено».

/home/ME/nacl/pepper_35/toolchain/linux_x86_newlib/bin/../lib/gcc/x86_64-nacl/4.4.3/../../../../x86_64-nacl/bin/ld: skipping incompatible /home/ME/nacl/pepper_35/toolchain/linux_x86_newlib/i686-nacl/usr/lib/libtomcrypt.a when searching for -ltomcrypt
/home/ME/nacl/pepper_35/toolchain/linux_x86_newlib/bin/../lib/gcc/x86_64-nacl/4.4.3/../../../../x86_64-nacl/bin/ld: skipping incompatible /home/ME/nacl/pepper_35/toolchain/linux_x86_newlib/bin/../x86_64-nacl/usr/lib/libtomcrypt.a when searching for -ltomcrypt
/home/ME/nacl/pepper_35/toolchain/linux_x86_newlib/bin/../lib/gcc/x86_64-nacl/4.4.3/../../../../x86_64-nacl/bin/ld: cannot find -ltomcrypt

collect2: ld returned 1 exit status
make: *** [newlib/Release/my_module_unstripped_x86_32.nexe] Error 1

Makefile

Копия существующего примера в загруженном nacl sdk. Изменено с помощью tomcrypt, что приводит к флагу -ltomcrypt.

VALID_TOOLCHAINS := newlib glibc pnacl linux

NACL_SDK_ROOT ?= $(abspath $(CURDIR)/../..)

include $(NACL_SDK_ROOT)/tools/common.mk


TARGET = my_module
LIBS = ppapi_cpp ppapi pthread tomcrypt

CFLAGS = -Wall
SOURCES = my_module.cc

# Build rules generated by macros from common.mk:

$(foreach src,$(SOURCES),$(eval $(call COMPILE_RULE,$(src),$(CFLAGS))))

ifeq ($(CONFIG),Release)
$(eval $(call LINK_RULE,$(TARGET)_unstripped,$(SOURCES),$(LIBS),$(DEPS)))
$(eval $(call STRIP_RULE,$(TARGET),$(TARGET)_unstripped))
else
$(eval $(call LINK_RULE,$(TARGET),$(SOURCES),$(LIBS),$(DEPS)))
endif

$(eval $(call NMF_RULE,$(TARGET),))

Что у меня есть

  • Linux 3.13.0-32-generic #57-Ubuntu SMP Вт, 15 июля, 03:51:08 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
  • my_module.cc - nacl module code (no more .cc files)
    • #include <tomcrypt.h>
  • Makefile (выше)
  • ~/nacl/pepper_35/
  • ~/nacl/naclports

Я попытался переустановить libtocrypt с помощью naclports, но безуспешно. Как я понимаю, моя библиотека tomcrypt построена как 32-битная, но я не знаю, как указать компилятору сделать ее 64-битной.

Ошибок нет, если Makefile без флага tomcrypt.

Я не про Makefile или C++, но копаюсь там медленно, так что лучше дать инструкции для меня, как для новичка в этой теме :D


person briiC    schedule 11.08.2014    source источник


Ответы (1)


На самом деле это была другая проблема. (Я понял это сразу после того, как отправил вопрос.. И только сейчас смог его протестировать).

На самом деле мне удалось создать 64-битный .nexe. Проблема была с 32-битным .nexe. Не удалось, что я не мог их скомпилировать. Было дано сообщение об ошибке «пропуск несовместимости», что я пытался найти 32-битный файл, но он был 64-битным. Когда я понимаю, что нашел аналогичную проблему и совет по решению.

Вернитесь к naclports и удалите установленные библиотеки.

$ cd naclports/src
$ ./make_all.sh clean

Отредактируйте make_all.sh, чтобы скомпилировать библиотеки naclports с флагами -m32.

Сначала установите g++-multilib, чтобы иметь возможность компилировать 32-битные приложения. У меня убунту, так что

sudo apt-get install g++-multilib

Затем определите переменные флага и переместите раздел # i686 NaCl в конец (чтобы заданные флаги не нарушали другие 64-битные разделы)

...
export CFLAGS
export CXXFLAGS
export LDFLAGS

...     
# i686 NaCl
NACL_ARCH=i686
TOOLCHAIN=glibc
CFLAGS="-m32"
CXXFLAGS="-m32"
LDFLAGS="-m32"
make ${TARGETS}
TOOLCHAIN=newlib
make ${TARGETS}

Сделайте свои библиотеки снова

./make_all.sh libtomcrypt

Наконец, сделайте свой модуль NaCl

Используя тот же Makefile, который я скопировал в вопросе.

$ cd my_module/
$ make
  CXX  newlib/Release/my_module_x86_32.o
  LINK newlib/Release/my_module_unstripped_x86_32.nexe
  VALIDATE newlib/Release/my_module_unstripped_x86_32.nexe
  CXX  newlib/Release/my_module_x86_64.o
  LINK newlib/Release/my_module_unstripped_x86_64.nexe
  VALIDATE newlib/Release/my_module_unstripped_x86_64.nexe
  CXX  newlib/Release/my_module_arm.o
  LINK newlib/Release/my_module_unstripped_arm.nexe
  VALIDATE newlib/Release/my_module_unstripped_arm.nexe
  STRIP newlib/Release/my_module_x86_32.nexe
  STRIP newlib/Release/my_module_x86_64.nexe
  STRIP newlib/Release/my_module_arm.nexe
  CREATE_NMF newlib/Release/my_module.nmf

Успех!

person briiC    schedule 11.08.2014