পরীক্ষামূলক :: ফাইল সিস্টেম লিংকার ত্রুটি


98

আমি জিসিসি 6.0 এর মধ্যে বিকাশের মাথায় আসলে নতুন সি ++ 1z বৈশিষ্ট্যগুলি ব্যবহার করার চেষ্টা করি।

আমি যদি এই ছোট্ট উদাহরণটি চেষ্টা করি:

#include <iostream>
#include <experimental/filesystem>
namespace fs = std::experimental::filesystem;
int main()
{
    fs::path p1 = "/home/pete/checkit";

    std::cout << "p1 = " << p1 << std::endl;
}

আমি পেয়েছি:

/ opt / linux-gnu_6-20151011 / bin / g ++ --std = c ++ 1z main.cpp -O2 -g-go যান
/tmp/ccaGzqFO.o: ফাংশনে \ `std :: পরীক্ষামূলক :: ফাইল সিস্টেম :: v1 :: __ cxx11 :: পাথ :: পথ (চর কনস্ট (&) [36]) ':
/opt/linux-gnu_6-20151011/incolve/c++/6.0.0/experimental/bit/fs_path.huthor67: `স্টাড :: পরীক্ষামূলক :: ফাইলসিস্টেম :: ভি 1 :: __ সিএক্সএক্স 11 :: পথ :: _ এম_স্প্লিট_সিম্পেটস () '
সংগ্রহ 2: ত্রুটি: ld 1 প্রস্থান স্থিতি ফিরে এসেছে

জিসিসি সংস্করণ হ'ল স্ন্যাপশট লিনাক্স-gnu_6-20151011

নতুন সি ++ 1z বৈশিষ্ট্যগুলির জন্য কীভাবে লিঙ্ক করবেন কোনও ইঙ্গিত?

উত্তর:


161

ফাইল সিস্টেম টিএস সি ++ 1z সমর্থনের সাথে কিছুই করার নয়, এটি সম্পূর্ণ আলাদা স্পেসিফিকেশন যা সি ++ 1z ওয়ার্কিং ড্রাফটের অংশ নয়। জিসিসির বাস্তবায়ন (জিসিসি 5.3 এবং তারপরে) এমনকি সি ++ 11 মোডে উপলব্ধ।

এটি -lstdc++fsব্যবহার করার জন্য আপনাকে কেবল লিঙ্ক করতে হবে।

(প্রাসঙ্গিক গ্রন্থাগার, libstdc++fs.aএকটি স্ট্যাটিক লাইব্রেরি, সুতরাং যে কোনও স্থির গ্রন্থাগারের সাথে এটি লিঙ্কার কমান্ডের উপর নির্ভর করে কোনও বস্তুর পরে আসে should )

আপডেট নভেম্বর 2017: সেইসাথে ফাইলসিস্টেম হিজড়া, জিসিসি 8.x এছাড়াও সি ++ 17 ফাইলসিস্টেম গ্রন্থাগার, সংজ্ঞায়িত একটি বাস্তবায়ন হয়েছে <filesystem>এবং নামস্থানে std::filesystem(বিশেষ দ্রষ্টব্য কোন "পরীক্ষামূলক" ঐ নামে) যখন ব্যবহার -std=gnu++17বা -std=c++17। জিসিসির সি ++ 17 সমর্থনটি এখনও সম্পূর্ণ বা স্থিতিশীল নয় এবং এটি প্রাইম টাইম ব্যবহারের জন্য প্রস্তুত হিসাবে বিবেচনা না করা অবধি আপনাকে -lstdc++fsসি ++ 17 ফাইল সিস্টেম বৈশিষ্ট্যগুলির সাথেও লিঙ্ক করতে হবে ।

জানুয়ারী 2019 আপডেট করুন: জিসিসি 9 দিয়ে শুরু করে, সি ++ 17 std::filesystemউপাদান ছাড়াই ব্যবহার করা যেতে পারে -lstdc++fs(তবে আপনার এখনও সেই লাইব্রেরির প্রয়োজন রয়েছে std::experimental::filesystem)।


4
এটি কি কোথাও নথিভুক্ত করা হয়েছে, আমি নিজেই এটি নির্ধারণ করার চেষ্টা করেছি এবং ডাব্লু / কিছুই এলো না, আমি কি এখানে কিছু সংস্থান মিস করেছি?
শফিক ইয়াঘমোর

4
@ শফিকিক ইয়াগমুর, আমি সবেমাত্র ডক্স আপডেট করেছি: gcc.gnu.org/onlinesocs/libstdc++/manual/… gcc.gnu.org/onlinesocs/libstdc++/manual/… gcc.gnu.org/onlinesocs/libstdc++/manual/… (নীচে)
জোনাথন ওয়েকেলি

4
আমি এটি ব্যবহার করার চেষ্টা করার সময় আমি একই লিঙ্কারের ত্রুটি পাই। c++ -lstd++fs main.cpp। আমি ব্যবহার করছিgcc version 5.3.1 20151207 (Red Hat 5.3.1-2) (GCC)
alfC

15
ঠিক আছে, -lstdc++fsলাইনের শেষে থাকতে হবে (অন্তত উত্স ফাইলের পরে)। আমি বুঝতে পারি না কেন কারও কারও -lxxxশেষে হওয়া দরকার এবং অন্যরা কেন না।
alfC

4
@alfC, কারণ এভাবেই লিঙ্কারগুলি কাজ করে। রেফারেন্সগুলি বাম থেকে ডানে সমাধান করা হয়, সুতরাং আপনার ব্যবহৃত বস্তুগুলির পরে আপনার স্থির লাইব্রেরি তালিকাভুক্ত করা দরকার।
জোনাথন ওয়াকলি

35

আপনি যদি cmake ব্যবহার করছেন, নিম্নলিখিত লাইন যোগ করুন CMakeLists.txt:

link_libraries(stdc++fs)

যাতে চক্রটি সম্পর্কিত লাইব্রেরির সাথে লিঙ্ক করতে পারে।


12
আমি করেছি target_link_libraries(hello_world_ stdc++fs)এবং এটি সংকলিত।
sunapi386

14

ঝাঁকুনি 4.0+ এর সাথে আপনার লিঙ্ক করা প্রয়োজন libc++experimental.a

আপনি -stdlib = libc ++ (মন্তব্যগুলিতে উল্লিখিত) দিয়ে libc ++ (libstdc ++ নয়) দিয়ে তৈরি করছেন তা নিশ্চিত করুন


আমার -stdlib = libc ++ এরও দরকার ছিল কারণ আমার ক্ল্যাং সংস্করণটি অপ্রত্যাশিতভাবে libstdc ++ ব্যবহার করছিল।
বোয়ি ওভেনস

এটি পরিষ্কার করার জন্য @ বোওইউভেনস ধন্যবাদ, আপডেট উত্তর।
xaxxon

আপনি যখন বলেন "আপনি libc ++ দিয়ে নির্মাণ করছেন তা নিশ্চিত করুন", আমি কীভাবে এটি করব? (সিএমকে দিয়ে সর্বাধিক সমাধান) ধন্যবাদ
mannyglover

4
@mannyglover -stdlib=libc++ বাset(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
xaxxon

4

এখানে একটি ডেমো যা ভবিষ্যতে কারও পক্ষে সহায়ক হতে পারে:

env: el6,gcc/5.5.0

#include <iostream>
#include <string>
#include <experimental/filesystem>

int main()
{
    std::string path = std::experimental::filesystem::current_path();

    std::cout << "path = " << path << std::endl;
}

নিম্নলিখিত সংকলন এবং পরীক্ষা করা হয়। পতাকাগুলি হ'ল -std=c++17 -lstdc++fs:

$ g++ -v
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/apps/gcc-5.5.0/bin/../libexec/gcc/x86_64-unknown-linux-gnu/5.5.0/lto-wrapper
Target: x86_64-unknown-linux-gnu
Configured with: ../configure --prefix=/apps/gcc-5.5.0 --disable-multilib --enable-shared --enable-threads=posix --enable-__cxa_atexit --enable-clocale=gnu --enable-languages=all
Thread model: posix
gcc version 5.5.0 (GCC)

$ ls -lrt /apps/gcc-5.5.0/lib64 | grep libstdc
-rwxr-xr-x. 1 root root  11272436 Jun 25 10:51 libstdc++.so.6.0.21
-rw-r--r--. 1 root root      2419 Jun 25 10:51 libstdc++.so.6.0.21-gdb.py
-rwxr-xr-x. 1 root root       976 Jun 25 10:51 libstdc++.la
-rwxr-xr-x. 1 root root  11272436 Jun 25 10:51 libstdc++.so
-rw-r--r--. 1 root root  10581732 Jun 25 10:51 libstdc++fs.a
-rw-r--r--. 1 root root  28985412 Jun 25 10:51 libstdc++.a
-rwxr-xr-x. 1 root root       916 Jun 25 10:51 libstdc++fs.la
-rwxr-xr-x. 1 root root  11272436 Jun 25 10:51 libstdc++.so.6

$ g++ filesystem-testing.cpp -lstdc++fs -std=c++17
$ ./a.out

$ g++ -std=c++17 filesystem-testing.cpp -lstdc++fs
$ ./a.out
path = /home/userid/projects-c++/filesystem-testing

এটি পতাকাগুলির সাথেও কাজ করে: -std=c++11

$ g++ -std=c++11 filesystem-testing.cpp -lstdc++fs
$ ./a.out
path = /home/userid/projects-c++/filesystem-testing

নিম্নলিখিতগুলিতে সংকলন ত্রুটি ছিল _ZNSt12experimental10filesystem2v112current_pathB5cxx11Ev

$ g++ -std=c++17 -lstdc++fs filesystem-testing.cpp
/tmp/ccA6Q9oF.o: In function `main':
filesystem-testing.cpp:(.text+0x11): undefined reference to `_ZNSt12experimental10filesystem2v112current_pathB5cxx11Ev'
collect2: error: ld returned 1 exit status
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.