2

プロジェクトに C++ webframework を使用しています。gitmodel の例に認証を追加しようとしています。

次のエラーが表示されます。

../hangman/CMakeFiles/hangman.wt.dir/Session.o: In function `Session::Session()':     /home/s/Downloads/wt-3.2.3/examples/hangman/Session.C:101: undefined reference to `void Wt::Dbo::Session::mapClass<User>(char const*)'
../hangman/CMakeFiles/hangman.wt.dir/Session.o: In function `Wt::Auth::Dbo::AuthInfo<User>::user() const': /home/s/Downloads/wt-3.2.3/src/Wt/Auth/Dbo/AuthInfo:94: undefined reference to `Wt::Dbo::ptr<User>::ptr(Wt::Dbo::ptr<User> const&)'
../hangman/CMakeFiles/hangman.wt.dir/Session.o: In function `Session::user() const': /home/s/Downloads/wt-3.2.3/examples/hangman/Session.C:138: undefined reference to `Wt::Dbo::ptr<User>::operator bool() const' 
/home/s/Downloads/wt-3.2.3/examples/hangman/Session.C:139: undefined reference to `User::User()'
/home/s/Downloads/wt-3.2.3/examples/hangman/Session.C:139: undefined reference to `Wt::Dbo::ptr<User> Wt::Dbo::Session::add<User>(User*)'
/home/s/Downloads/wt-3.2.3/examples/hangman/Session.C:139: undefined reference to `Wt::Dbo::ptr<User>::operator=(Wt::Dbo::ptr<User> const&)'

完全なエラー リスト: http://pastie.org/5469803

cmake で生成された makefile を使用してみました。トレースした後、このリンカー エラーは、CMakeFiles ディレクトリの下で link.txt を実行した後であることがわかりました。hangman も認証を行うため、gitmodel の例と hangman の例の link.txt を結合しようとしました。ここに私のlink.txtがあります:

/usr/bin/c++   -O2 -g ../hangman/CMakeFiles/hangman.wt.dir/Session.o CMakeFiles/gitview.wt.dir/Git.o CMakeFiles/gitview.wt.dir/GitModel.o CMakeFiles/gitview.wt.dir/__/wt-homepage/SourceView.o CMakeFiles/gitview.wt.dir/GitView.o  -o gitview.wt -rdynamic -L/home/s/Downloads/wt-3.2.3/build/src/http -L/home/s/Downloads/wt-3.2.3/build/src -L/home/s/Downloads/wt-3.2.3/build/src/Wt/Dbo -L/home/s/Downloads/wt-3.2.3/build/src/Wt/Dbo/backend -lcrypt -L/usr/local/lib ../../src/http/libwthttp.so.3.2.3 ../../src/libwt.so.3.2.3 ../../src/Wt/Dbo/libwtdbo.so.3.2.3 ../../src/Wt/Dbo/backend/libwtdbosqlite3.so.3.2.3  /usr/local/lib/libboost_filesystem.so /usr/local/lib/libboost_random.so /usr/local/lib/libboost_regex.so /usr/local/lib/libboost_signals.so /usr/local/lib/libboost_system.so /usr/local/lib/libboost_filesystem.so -lz -lssl -lcrypto ../../src/Wt/Dbo/libwtdbo.so.3.2.3 /usr/local/lib/libboost_thread.so /usr/local/lib/libboost_program_options.so /usr/local/lib/libboost_date_time.so -lpthread -ldl -Wl,-rpath,/home/s/Downloads/wt-3.2.3/build/src/http:/home/s/Downloads/wt-3.2.3/build/src:/home/s/Downloads/wt-3.2.3/build/src/Wt/Dbo:/home/s/Downloads/wt-3.2.3/build/src/Wt/Dbo/backend:/usr/local/lib

ペーストリーのリンク: http://pastie.org/5469815

私のリンクコマンドの何が問題なのか誰か教えてください。

cmakeを実行すると、

/home/s/Downloads/wt-3.2.3/examples/gitmodel on master ✗ at  1:24PM 
➜ BOOST_FS_LIB=/usr/local/lib/libboost_filesystem.so cmake . 
-- ** Not building gitmodel example: requires boost_filesystem library.
CMake Warning (dev) in CMakeLists.txt:
  No cmake_minimum_required command is present.  A line of code such as

   cmake_minimum_required(VERSION 2.8)

 should be added at the top of the file.  The version specified may be lower
 if you wish to support older CMake versions for this project.  For more
 information run "cmake --help-policy CMP0000".
 This warning is for project developers.  Use -Wno-dev to suppress it.

-- Configuring done
-- Generating done
-- Build files have been written to: /home/s/Downloads/wt-3.2.3/examples/gitmodel
4

2 に答える 2

1

リンカーがDboシンボルを検出していないようです。

cmakeでコンパイルしている場合は、CMakelist.txtを提供していただけますか?

gitmodelCmakelistとauthCmakelistの例を見ると、wtdbowtdbosqlite3をTARGET_LINK_LIBRARIESに追加するだけで十分です。

user@debiam:~$ cat /usr/lib/Wt/examples/gitmodel/CMakeLists.txt
IF(NOT WIN32)

IF(BOOST_FS_LIB)
  WT_ADD_EXAMPLE(gitview.wt
    Git.C
    GitModel.C
    ../wt-homepage/SourceView.C
   GitView.C
 )
TARGET_LINK_LIBRARIES(gitview.wt ${BOOST_FS_LIB} ${BOOST_SIGNALS_LIB} ${BOOST_SYSTEM_LIB})

INCLUDE_DIRECTORIES(
  ${WT_SOURCE_DIR}/src
)

ADD_DEPENDENCIES(gitview.wt wt ${EXAMPLES_CONNECTOR})

ELSE(BOOST_FS_LIB)

  MESSAGE(STATUS "** Not building gitmodel example: requires boost_filesystem library.")

ENDIF(BOOST_FS_LIB)

ELSE(NOT WIN32)

  MESSAGE(STATUS "** Not building gitmodel example: uses POSIX calls not available on win32")

ENDIF(NOT WIN32)

user@debiam:~$ cat /usr/lib/Wt/examples/feature/auth1/CMakeLists.txt
WT_ADD_EXAMPLE(auth1.wt 
        Auth1.C
    model/Session.C
    model/User.C
) 

TARGET_LINK_LIBRARIES(auth1.wt wtdbo wtdbosqlite3 ${BOOST_SIGNALS_LIB} ${BOOST_SYSTEM_LIB})

INCLUDE_DIRECTORIES(${WT_SOURCE_DIR}/src)
于 2012-12-03T09:47:02.347 に答える
0

ソース ファイルとして User.C が含まれていないように見えますか? また、意図せず離れた可能性があります

DBO_EXTERN_TEMPLATES(User);

対応する場所をどこにも持たずに、ヘッダーファイルに

DBO_INSTANTIATE_TEMPLATES(User);

推奨される解決策: DBO_EXTERN_TEMPLATES(...) 行をすべて削除します。

于 2012-12-24T12:24:04.817 に答える