Не удается найти действительную библиотеку при создании файла приложения.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 (не более.cc файлов)
    • #include <tomcrypt.h>
  • Makefile (выше)
  • ~/nacl/pepper_35/
  • ~/nacl/naclports

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

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

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

1 ответ

Решение

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

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

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

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

редактировать make_all.sh скомпилировать naclports libs с -m32 флаги

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

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

Успех!

Другие вопросы по тегам